我有以下代码:
#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在预处理时应该是未定义的,预处理器没有错误吗?
答案 0 :(得分:5)
在编译器正确处理源代码之前,预处理器在单独的阶段运行。因此,它对实际源代码中的符号一无所知(例如枚举或变量)。
对于预处理器,符号B
是一个未知的宏,在该上下文中使用时,#if C == B
等于零。由于符号A
也是 而不是宏,因此它的值也将为零。所有这些都租给了比较#if 0 == 0
,这的确是事实。
例如参见this phases of translation reference获取有关翻译阶段的更多信息,this preprocessor conditional reference获取有关翻译阶段的更多信息。