#if中使用的未定义常量的值是多少?

时间:2011-02-22 23:42:21

标签: c++ c-preprocessor

为了评估#if条件,我的预处理器似乎假定未定义的常量为0。

可以依赖它,还是未定义的常量给出未定义的行为?

3 个答案:

答案 0 :(得分:63)

是的,可以依赖它。 C99标准在§6.10.1¶3中指定:

  

由于宏扩展和定义的一元所有替换后   已执行运算符,所有剩余的标识符将替换为pp-number    0

修改

抱歉,我认为这是一个C问题;仍然没什么大不了的,C ++标准中的等效部分(§16.1¶4)表明:

  

由于宏扩展和定义的一元运算符而导致的所有替换后   已执行,除truefalse之外的所有剩余标识符和关键字都将替换为pp-number 0

唯一的区别是truefalse的不同处理,在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编译器将其评估为一个未定义的符号。