5

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

enum{
    A,
    B,
    MAX
}

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

1 回答 1

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 标准中的措辞相同。

于 2013-04-19T08:28:46.080 回答