枚举值是在预处理时间还是在编译时解决的?

时间:2013-04-19 08:19:48

标签: c c11

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

enum{
    A,
    B,
    MAX
}

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

1 个答案:

答案 0 :(得分:7)

预处理器与枚举没有任何关系。但是你的例子编译时没有错误,那么#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-number 0,然后每个预处理令牌   转换为令牌。 ...

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