我使用 C 已经一年多了,我想知道
#define
到底是如何工作的。
我知道你可以将它用作宏,例如。 #define MUL(x, y) (x*y)
,但是当你定义某件事而不给出定义时会发生什么?
例如
#ifndef _SYNNOVESLIB_H
#define _SYNNOVESLIB_H
#endif
它是否只是被 GCC 或正在使用的任何编译器标记为“已定义”或 true(如 1 中所示)?
是的,
#define _SYNNOVESLIB_H
只是告诉编译器定义_SYNNOVESLIB_H
是为了检查是否定义了宏,例如defined
、#ifdef
和#ifndef
。
6.10 预处理指令 提供了
#define
的语法。
control-line:
# define identifier replacement-list new-line
replacement-list:
pp-tokens(opt)
pp-tokens:
preprocessing-token
pp-tokens preprocessing-token
replacement-list
是预处理器标记的可选列表,因此它可以为空。
来自 6.10.1 有条件包含
- 控制条件包含的表达式应为整数常量表达式,但以下情况除外:标识符(包括词法上与关键字相同的标识符)解释如下;169)并且它可以包含以下形式的一元运算符表达式
defined identifier
或
defined ( identifier )
如果标识符当前被定义为宏名称(即,如果它是预定义的,或者 如果它是 #define 预处理指令的主题,而没有具有相同主题标识符的介入 #undef 指令,则计算结果为 1 ),如果不是则为 0。
请注意,该值并不重要,只要它已被定义即可。
- 表单的预处理指令
# ifdef identifier new-line groupopt
或
# ifndef identifier new-line groupopt
检查标识符当前是否定义为宏名称。它们的条件分别相当于
和#if defined identifier
。#if !defined identifier
编译器内部具体如何处理这取决于编译器,但一个简单的哈希表就可以了。
#define _SYNNOVESLIB_H
将添加具有 null 或空值的 _SYNNOVESLIB_H
键。 #ifndef _SYNNOVESLIB_H
将检查哈希表中是否存在键,忽略值。 #undef _SYNNOVESLIB_H
从桌子上移除钥匙。