プリプロセッサのトリックをいくつかプレイできます。例として、GCC ソース ツリーの実装では、gcc/tree.def
ファイルに触発されることがあります。
したがって、たとえばmyenum.def
、次のようなものを含む1つのファイルがある場合があります
MYENUM(Pink)
MYENUM(Red)
MYENUM(Ivory)
次に、次のようなコードで列挙型を定義できます
enum my_enum {
#define MYENUM(Name) Name,
#include "myenum.def"
#undef MYENUM
};
(上記のNone_
前と後に入れたいと思うかもしれません)#include
Last_
次に、たとえば列挙型から文字列へのコンバーターを使用できます
const char* myenum_to_string(enum my_enum en) {
switch(en) {
#define MYENUM(Name) case Name: return #Name;
#include "myenum.def"
#undef MYENUM
default: return NULL; /* should not happen */
}
}
そして、例えば文字列から列挙型へのコンバーターがあるかもしれません
enum myenum string_to_my_enum (const char*str) {
#define MYENUM(Name) if (!strcmp(str, #Name)) return Name;
#include "myenum.def"
#undef MYENUM
else abort ();
}
上記はすべて一般的な方法であり、特定のコンパイラに関連付けられているわけではありません ( gcc
、clang
、tcc
、icc
または C99 準拠のコンパイラで動作するはずです)。
さらに、(最近の でコンパイルできるよりもgcc
) 大規模なコード ベースがあり、その中に何百ものコードenum
があり、そのすべてに対してそのようなトリックを実行したくない場合は、たとえば GCC プラグインまたは拡張 (コードのGCC内の内部表現を使用して、enum
宣言から同様の C コードを生成します。新しいソフトウェアをコーディングしている場合、またはソフトウェア ベースをよく知っている場合は、enum
コードを同様のトリックに置き換えることができます。