在预处理程序指令中使用枚举值

Ema*_*ini 1 c preprocessor

我有以下代码:

#include <stdio.h>

enum {A, B};

#define C A

int main() {
#if C == B
  printf("%d==%d\n", C, B);
#else
  printf("%d!=%d\n", C, B);
#endif
}
Run Code Online (Sandbox Code Playgroud)

这令人惊讶地给出了输出:

0==1
Run Code Online (Sandbox Code Playgroud)

现在,我理解代码是错误的,因为预处理器不知道枚举值.我不明白为什么没有生成错误... A和B应该在预处理时间未定义,预处理器如何不给出错误?

Som*_*ude 5

在编译器正确处理源之前,预处理器在单独的阶段运行.因此,它对实际源代码中的符号(如枚举或变量)一无所知.

对于预处理器,符号B是未知宏,当在该上下文(#if C == B)中使用时,它将等于零.由于符号A没有一个宏,它也将评估为零.所有这些租约到比较#if 0 == 0确实如此.

有关转换阶段的更多信息,请参阅此转换参考阶段,以及此预处理器条件参考以获取有关该转换阶段的更多信息.