【问题标题】:Are enum values resolved in preprocess time or in compile time?枚举值是在预处理时还是在编译时解析的?
【发布时间】:2013-04-19 08:19:48
【问题描述】:

枚举值何时解析?也就是说,下面的代码sn-p是否符合标准?

enum{
    A,
    B,
    MAX
}

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

【问题讨论】:

  • 枚举与预处理器无关。
  • @Michael Burr,上面的代码实际上在 MSVC6.0 中编译时没有警告。那是 C89 - 喜欢。
  • 我猜它不能用枚举中的双 u 编译!
  • 如果它编译了呢? MAX 的值为 0。这是一个质量非常低的问题。
  • @JimBalter MAX 这里的值为 2。

标签: c c11


【解决方案1】:

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

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

enum{
    A,
    B,
    MAX
}

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

来自 C99 6.10.1/3“条件包含”:

...由于宏扩展和定义的所有替换 一元运算符已执行,所有剩余的标识符都是 替换为 pp-number 0,然后每个预处理标记是 转换为令牌。 ...

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

【讨论】:

  • 我犯了一个愚蠢的错误!谢谢大家解决这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多