手間のかからない C 列挙型の文字列への変換
C コードで名前付き列挙型が見つかったとします。
enum MyEnum { FOO, BAR = 0x50 };
そして、それぞれの変換関数を備えたヘッダーを生成するスクリプトを探します。 enum:
char* enum_to_string(MyEnum t);
次のような単純な実装では:
char* enum_to_string(MyEnum t){ switch(t){ case FOO: return "FOO"; case BAR: return "BAR"; default: return "INVALID ENUM"; } }
ただし、typedefed enum や名前のない C enum では状況が複雑になります。最適なソリューションを詳しく見てみましょう:
X-マクロ: チャンピオン
X-マクロが最上位の選択肢として浮上し、エレガントなソリューションを提供します:
#include <iostream> enum Colours { # define X(a) a, # include "colours.def" # undef X ColoursCount }; char const* const colours_str[] = { # define X(a) #a, # include "colours.def" # undef X 0 }; std::ostream& operator<<(std::ostream& os, enum Colours c) { if (c >= ColoursCount || c < 0) return os << "???"; return os << colours_str[c]; } int main() { std::cout << Red << Blue << Green << Cyan << Yellow << Magenta << std::endl; }
付属ファイル「colours.def」保持:
X(Red) X(Green) X(Blue) X(Cyan) X(Yellow) X(Magenta)
文字列出力のカスタマイズ
柔軟性を高めるために、文字列出力を微調整できます:
#define X(a, b) a, #define X(a, b) b, X(Red, "red") X(Green, "green") // etc.
以上がC の列挙型を文字列に簡単に変換し、Typedef と名前のない列挙型を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。