为了评估#if
条件,我的预处理器似乎假定未定义的常量为0。
可以依赖它,还是未定义的常量给出未定义的行为?
答案 0 :(得分:63)
是的,可以依赖它。 C99标准在§6.10.1¶3中指定:
由于宏扩展和定义的一元所有替换后 已执行运算符,所有剩余的标识符将替换为pp-number
0
修改强> 的
抱歉,我认为这是一个C问题;仍然没什么大不了的,C ++标准中的等效部分(§16.1¶4)表明:
由于宏扩展和定义的一元运算符而导致的所有替换后 已执行,除
true
和false
之外的所有剩余标识符和关键字都将替换为pp-number0
唯一的区别是true
和false
的不同处理,在C中不需要特殊处理,而在C ++中,即使在预处理阶段,它们也具有特殊含义。
答案 1 :(得分:14)
在评估表达式之前,未定义为宏的标识符将转换为0
。
例外是标识符true
,它被转换为1
。这是C ++预处理器特有的;在C中,这不会发生,您需要包含<stdbool.h>
以这种方式使用true
,在这种情况下,它将被定义为宏,不需要特殊处理。
答案 2 :(得分:1)
OP专门询问C预处理程序,第一个答案正确地参考了C预处理程序规范。但是其他一些评论似乎模糊了C预处理程序和C编译器之间的区别。需要明确的是,这是两个具有不同规则的不同事物,它们分别应用于两个独立的过程中。
#if 0 == NAME_UNDEFINED
int foo = NAME_UNDEFINED;
#endif
此示例将成功输出foo定义,因为C预处理程序将NAME_UNDEFINED评估为0作为条件表达式的一部分,但由于未将初始化程序评估为条件表达式,然后生成了编译器错误,因此C编译器将其评估为一个未定义的符号。