C 枚举值是在预处理时还是在编译时解析的?

C 枚举值是在预处理时还是在编译时解析的?,c,c11,C,C11,枚举值何时解析?换句话说,以下代码段是否符合标准 enum{ A, B, MAX } #if MAX > 42 # error "Woah! MAX is a lot!" #endif 预处理器与枚举无关。但是您的示例编译时没有错误,那么#if MAX>42指令是怎么回事 每当预处理器处理条件指令时,任何未定义为宏的标识符都将被视为0。因此,假设MAX没有在其他地方定义为宏,那么您的代码片段相当于: enum{ A, B, MAX

枚举值何时解析?换句话说,以下代码段是否符合标准

enum{
    A,
    B,
    MAX
}

#if MAX > 42
#    error "Woah! MAX is a lot!"
#endif

预处理器与枚举无关。但是您的示例编译时没有错误,那么
#if MAX>42
指令是怎么回事

每当预处理器处理条件指令时,任何未定义为宏的标识符都将被视为0。因此,假设
MAX
没有在其他地方定义为宏,那么您的代码片段相当于:

enum{
    A,
    B,
    MAX
}

#if 0 > 42
#    error "Woah! MAX is a lot!"
#endif
来自C99 6.10.1/3“条件包含”:

。。。由于宏扩展和定义的 已执行一元运算符,所有剩余标识符均为 替换为pp编号0,然后删除每个预处理令牌 已转换为令牌


C89/C90标准中也有同样的措辞。

枚举与预处理器无关。@Michael Burr,上述代码在MSVC6.0中编译时实际上没有警告。这就像C89一样。我猜它不会在enum中使用double
u
编译!那么,如果它编译了呢?MAX的值为0。这是一个质量很低的问题。@JimBalter MAX在这里的值是2。我犯了一个愚蠢的错误!谢谢大家把这件事弄清楚。