我有以下代码:
#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 在预处理时应该是未定义的,预处理器怎么没有给出错误?
最佳答案
在编译器正确处理源代码之前,预处理器在一个单独的阶段运行。因此,它对实际源代码中的符号一无所知(如枚举或变量)。
对于预处理器,符号 B
是一个未知的宏,当在该上下文中使用时(#if C == B
)它将等于零。由于符号 A
也不是宏,因此它的计算结果也将为零。所有这些租借给比较 #if 0 == 0
这确实是真的。
参见例如this phases of translation reference有关翻译阶段的更多信息,以及 this preprocessor conditional reference了解更多相关信息。
关于c - 在预处理器指令中使用枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52099607/