ホームページ > バックエンド開発 > C++ > C および C で列挙型を文字列に効率的に変換するにはどうすればよいですか?

C および C で列挙型を文字列に効率的に変換するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-29 22:52:17
オリジナル
237 人が閲覧しました

How to Efficiently Convert Enum Types to Strings in C and C  ?

列挙型の文字列への変換: 総合ガイド

列挙型変数の文字列への変換は、プログラミングにおける一般的な要件です。たとえば、列挙値を読み取り可能な形式で出力する場合、または文字列引数を期待する関数にパラメータとして渡す場合に、これが必要になります。

素朴なアプローチ: 手動変換

列挙型への 1 つの直接的なアプローチ型変換は、列挙型ごとに手動関数を作成することです。たとえば、OS_type 列挙型を変換するには:

enum OS_type { Linux, Apple, Windows };

inline const char* ToString(OS_type v)
{
    switch (v)
    {
        case Linux:   return "Linux";
        case Apple:   return "Apple";
        case Windows: return "Windows";
        default:      return "[Unknown OS_type]";
    }
}
ログイン後にコピー

ただし、このアプローチでは、列挙型の数が増えるとメンテナンスの問題が発生しやすくなります。

Boost.Preprocessor を使用したプリプロセッサベースのソリューション

Boost.Preprocessor ライブラリは、列挙型変換を処理するためのより洗練された自動化された方法を提供します。プリプロセッサを利用して変換関数を動的に生成します。次の 2 つのマクロでこれを実現します。

#define X_DEFINE_ENUM_WITH_STRING_CONVERSIONS_TOSTRING_CASE(r, data, elem) \
    case elem : return BOOST_PP_STRINGIZE(elem);

#define DEFINE_ENUM_WITH_STRING_CONVERSIONS(name, enumerators) \
    enum name { \
        BOOST_PP_SEQ_ENUM(enumerators) \
    }; \
    \
    inline const char* ToString(name v) \
    { \
        switch (v) \
        { \
            BOOST_PP_SEQ_FOR_EACH( \
                X_DEFINE_ENUM_WITH_STRING_CONVERSIONS_TOSTRING_CASE, \
                name, \
                enumerators \
            ) \
            default: return "[Unknown " BOOST_PP_STRINGIZE(name) "]"; \
        } \
    }
ログイン後にコピー

これらのマクロを使用すると、OS_type 列挙型を次のように定義できます。

DEFINE_ENUM_WITH_STRING_CONVERSIONS(OS_type, (Linux)(Apple)(Windows))
ログイン後にコピー

C および C での使用

In C では、ToString 関数を使用して enum 値を次のように変換できます。文字列:

#include <iostream>

int main()
{
    OS_type t = Windows;
    std::cout << ToString(t) << " " << ToString(Apple) << std::endl;
}
ログイン後にコピー

C の場合、ToString 関数は関数オーバーロードの代わりにマクロとして実装できます:

#define ToString(t) \
    [Unknown ""##t] [Linux "Linux"] [Apple "Apple"] [Windows "Windows"]
ログイン後にコピー

結論

この記事では 2 つを紹介しました。 enum 型変数を文字列に変換するためのメソッド: 手動関数を使用した単純なアプローチと、Boost.Preprocessor を使用したプリプロセッサ ベースのソリューション。プリプロセッサベースのアプローチは、特に多数の列挙型を扱う場合に、より堅牢で保守が容易です。

以上がC および C で列挙型を文字列に効率的に変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート