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

标签 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 在预处理时应该是未定义的,预处理器怎么没有给出错误?

最佳答案

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

对于预处理器,符号 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/

相关文章:

c - 将文本文件导出到 excel 以使用 'C' 程序绘制图形

c - 在一个整数除以另一个值可能为负的整数后对结果进行整数舍入的算法

java - 在 Beanshell 预处理器中停止 JMeter 测试

ios - 如何确定代码是否在 DEBUG/RELEASE build 中运行?

visual-studio-2008 - 在 Visual Studio 2008 中,是否有识别 64 位 Windows 操作系统的宏?

c++ - 如何将使用 malloc() 的 C 语句转换为 C++?

c - 如何在 C 程序中的 char 数组中分配输入(来自 echo 命令)

计算C中耗时

macros - 有没有办法让 Rust 宏像在 C 中一样充当文本替换?

c - 我的分号怎么了? (gcc 预处理器)