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

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

唯一的区别是不同处理的truefalse,其中用C不需特殊处理,而在C++中,他们有一个特殊的意义,即使在预处理阶段.

  • 只是好奇:编译器这样做的原因是什么?当表达式未定义并且编译器无论如何都知道这一点时,为什么编译器不能抛出错误消息?这岂不是会导致软件出现不必要的bug吗?我真的很困惑为什么较新的编译器不处理这个问题。仅仅是因为必须保持向后兼容性还是什么? (2认同)

Jam*_*lis 14

未定义为宏的标识符将0在计算表达式之前转换为.

标识符例外true,它被转换为1.这是C++预处理器特有的; 在C中,这不会发生,你需要包括<stdbool.h>使用true这种方式,在这种情况下,它将被定义为宏,不需要特殊处理.