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

时间:2018-08-30 14:32:59

标签: 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
}

令人惊讶的是,它给出了输出:

0==1

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

1 个答案:

答案 0 :(得分:5)

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

对于预处理器,符号B是一个未知的宏,在该上下文中使用时,#if C == B等于零。由于符号A也是 而不是宏,因此它的值也将为零。所有这些都租给了比较#if 0 == 0,这的确是事实。

例如参见this phases of translation reference获取有关翻译阶段的更多信息,this preprocessor conditional reference获取有关翻译阶段的更多信息。