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。我犯了一个愚蠢的错误!谢谢大家把这件事弄清楚。