给定以下 C 文件:
$ cat macros.c
#ifdef MACRO
# error MACRO is defined
#else
# error MACRO is undefined
#endif
#if MACRO
# error MACRO is non-zero
#else
# error MACRO is zero
#endif
以下的预期输出是什么?
$ gcc -c macros.c
$ gcc -DMACRO -c macros.c
$ gcc -DMACRO=0 -c macros.c
Answer:这是我机器上的 gcc 预处理器的作用。
$ gcc -c macros.c
macros.c:4:4: error: #error MACRO is undefined
macros.c:9:4: error: #error MACRO is zero
$ gcc -DMACRO -c macros.c
macros.c:2:4: error: #error MACRO is defined
macros.c:7:4: error: #error MACRO is non-zero
$ gcc -DMACRO=0 -c macros.c
macros.c:2:4: error: #error MACRO is defined
macros.c:9:4: error: #error MACRO is zero
$
Lesson: #ifdef MACRO
对于定义性评估为 true即使定义的值为 0(零).
另一个 C 预处理器问题!按照 C 标准,这应该是这样吗?
任何未定义的宏都将被视为定义为 0,以便计算控制表达式#if
声明。从 C99 §6.10.1/3-4(添加强调):
3) 表单的预处理指令
# if constant-expression new-line group
opt
# elif constant-expression new-line group
opt
检查控制常量表达式的计算结果是否为非零。
4) 在评估之前,预处理标记列表中的宏调用将成为
控制常量表达式被替换(修改的宏名称除外)
由defined
一元运算符),就像在普通文本中一样。如果令牌defined
是
由于此替换过程或使用而生成defined
一元运算符
与宏替换之前的两个指定形式之一不匹配,行为是
不明确的。由于宏扩展和defined
一元
运算符已执行,所有剩余的标识符(包括词法上的标识符)
与关键字相同)被替换为 pp-number 0,然后每个预处理
令牌被转换为令牌。 [...]
因此,例如,这样的表达式:
#if !FOO
将评估为1
if FOO
未定义,因为它将被视为 0,然后!FOO
将被评估为!0
,即1
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)