6

プリプロセッサ マクロの展開を禁止する方法はありますか? 一連の整数を定義するために使用する既存の 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

マクロと列挙値に同じ名前を付けることができる別の解決策はありますか?

4

1 に答える 1