我们说我有以下代码。根据 C 规范,条件指令始终评估为零是正确的,因为M
在编译时间之前展开,i
的值为zero
?如果我错了,有人可以解释一下:
#include <stdio.h>
#define M i
int main() {
int i = 10;
#if M == 0
i = 0;
#endif
printf("%d", i);
return 0;
}
答案 0 :(得分:4)
使用#if
非宏的标识符都被视为数字zero
。 gcc docs for #if列出了要求nicel,它说(强调我的前进):
#if expression
表达式是整数类型的C表达式,受到严格的限制。它可能包含
并注意到:
在某些情况下,这种捷径是不可取的。 -Wundef选项会导致GCC在遇到不是'#if'中的宏的标识符时发出警告。
draft C99 standard部分6.10.1
条件包含段 4 中包含以下内容:
[...]由于宏扩展和定义的一元所有替换后 运算符已执行,所有剩余标识符(包括那些词法 与关键字相同)被替换为pp-number 0 ,然后进行每次预处理 令牌被转换为令牌。[...]
答案 1 :(得分:1)
是的,它们被视为数字0。
C11§6.10.1条件包含
...在由于宏扩展和已定义的一元运算符执行的所有替换之后,所有剩余的标识符(包括与关键字词法相同的标识符)将替换为pp-number 0 ,并且然后将每个预处理令牌转换为令牌。
pp-number 在这里引用§6.4.8中的预处理数。