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

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

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-number 0,然后每个预处理标记都转换为标记。 …

C89 / C90标准中的措辞相同。