Ton*_*ark 61 c++ c-preprocessor
为了评估#if条件,我的预处理器似乎假设未定义的常量为0 .
可以依赖它,还是未定义的常量给出未定义的行为?
Mat*_*lia 67
是的,可以依赖它.C99标准在§6.10.13中规定:
在由于宏扩展和已定义的一元运算符执行的所有替换之后,所有剩余的标识符都被替换为pp编号
0
编辑
对不起,我以为这是一个C问题; 仍然没什么大不了的,C++标准(§16.14)中的等效部分指出:
在完成由于宏扩展和已定义的一元运算符而导致的所有替换之后,除了
true和之外的所有剩余标识符和关键字false将替换为pp编号0
唯一的区别是不同处理的true和false,其中用C不需特殊处理,而在C++中,他们有一个特殊的意义,即使在预处理阶段.
Jam*_*lis 14
未定义为宏的标识符将0在计算表达式之前转换为.
标识符例外true,它被转换为1.这是C++预处理器特有的; 在C中,这不会发生,你需要包括<stdbool.h>使用true这种方式,在这种情况下,它将被定义为宏,不需要特殊处理.