抑制宏观扩张

Mar*_*ato 6 c++

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

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

#define VALUE 0

MyEnum convert(int x) {
  if (x == VALUE) {
    return MyEnum::VALUE;
  }
  // ...
}
Run Code Online (Sandbox Code Playgroud)

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

我试图使用连接,但这没有帮助(编译器给出了相同的错误).

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

是否有另一种解决方案允许我为宏和枚举值具有相同的名称?

Ada*_*dam 3

您可以取消定义宏:

#undef VALUE
Run Code Online (Sandbox Code Playgroud)

包含标题后。

  • 请注意,这将使文件的其余部分未定义该宏,因此如果稍后要在源代码中使用该宏,则必须重新定义它。 (2认同)