ホームページ >バックエンド開発 >C++ >C の列挙型を文字列に簡単に変換し、Typedef と名前のない列挙型を処理するにはどうすればよいですか?

C の列挙型を文字列に簡単に変換し、Typedef と名前のない列挙型を処理するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-15 21:05:32968ブラウズ

How Can I Easily Convert C   Enums to Strings, Handling Typedefs and Unnamed Enums?

手間のかからない 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&amp; operator<<(std::ostream&amp; 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。