【问题标题】:Inhibit macro expansion抑制宏扩展
【发布时间】:2013-10-02 05:42:51
【问题描述】:

有什么方法可以抑制预处理器宏扩展?我有一个现有的 C 头文件,它使用 #define 定义一组整数,我想将它复制到具有相同值名称的 C++ 枚举。例如(使用 C++11):

enum MyEnum {
  VALUE,
  // ...
};

#define VALUE 0

MyEnum convert(int x) {
  if (x == VALUE) {
    return MyEnum::VALUE;
  }
  // ...
}

问题当然是MyEnum::VALUE 被翻译成MyEnum::0,这会导致语法错误。最好的解决方案是用枚举替换宏,但不幸的是,在我的情况下这不是一个选项。

我尝试使用串联,但这没有帮助(编译器给出了同样的错误)。

#define CONCAT(a,b) a##b
// ...
return MyEnum::CONCAT(VA,LUE);  // still results in MyEnum::0

是否有其他解决方案允许我为宏和枚举值使用相同的名称?

【问题讨论】:

  • 长久以来的约定是,ALL UPPERCASE 用于宏,而其他一切都使用至少一个小写字母。 IE。 enum MyEnum { Value }.

标签: c++


【解决方案1】:

您可以取消定义宏:

#undef VALUE

在包含标题之后。

【讨论】:

  • 请注意,这将使文件的其余部分未定义宏,因此如果稍后要在源代码中使用该宏,则必须重新定义它。
猜你喜欢
  • 2018-12-27
  • 2012-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多