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

4
我有以下的代码:
#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应该在预处理时未定义,预处理器为什么不报错呢?

3
在此查看您问题的答案:https://dev59.com/3lsW5IYBdhLWcg3wspAFC预处理器为什么会将枚举值视为相等?答案:这是因为在C中,枚举常量被视为整数常量。因此,在使用条件编译指令时,当比较两个枚举常量时,它们被视为它们的整数值而不是它们的标识符。这可能会导致预期外的结果。 - re_things
可能是为什么C预处理器将枚举值视为相等?的重复问题。 - Evan Carroll
1个回答

9

预处理器在编译器处理源代码之前单独运行。因此,它不知道实际源代码中的符号(如枚举或变量)。

对于预处理器而言,符号B是一个未知的宏,并且在该上下文中使用时(#if C == B),它将等于零。由于符号A也不是宏,它也会被计算为零。所有这些导致比较#if 0 == 0的结果确实为真。

有关翻译阶段的更多信息,请参见例如这个翻译阶段的参考资料,有关预处理器条件的更多信息,请参见此预处理器条件的参考资料


等于零,还是一个空的令牌序列? - StoryTeller - Unslander Monica
@StoryTeller 我曾在某处读到,在这种情况下它相当于零。我会努力找到相关资料。 - Some programmer dude
#if比较中的空令牌序列等于零。 - KamilCuk
1
@Someprogrammerdude - 现在我也读了 :) https://port70.net/~nsz/c/c11/n1570.html#6.10.1p4 - StoryTeller - Unslander Monica
@StoryTeller 来自cppreference:"任何不是字面量,也没有使用#define指令定义的标识符,都将被解释为0。" - Some programmer dude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接