0

enum私はCで数値データを含む配列要素にアクセスするためによく使用します。

#define KEYS_MAX 1
#define FIELD_MAX 2

enum {FIELD1=0, FIELD2};

double array[KEYS_MAX][FIELD_MAX];
array[1][FIELD1] = 1.0; array[1][FIELD2] = 2.0;

次に、データをKEYS_MAX行とFIELD_MAX列でファイルに出力します。後で列の内容を知るために、ヘッダー行を印刷したいと思います。

# KEY FIELD1 FIELD2
1 1.0 2.0

のみを変更してコードを更新しても、実行時にこれを正しく行うルーチンが必要enumです。つまり、C コードを使用してヘッダー行を出力するにはどうすればよいenumでしょうか。

私はこれを見つけました: C++で enum 値を文字列にマッピングしますが、Intel コンパイラでも動作するものを好むでしょう。

4

1 に答える 1

4

プリプロセッサのトリックをいくつかプレイできます。例として、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_前と後に入れたいと思うかもしれません)#includeLast_

次に、たとえば列挙型から文字列へのコンバーターを使用できます

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 ();
}

上記はすべて一般的な方法であり、特定のコンパイラに関連付けられているわけではありません ( gccclangtcciccまたは C99 準拠のコンパイラで動作するはずです)。

さらに、(最近の でコンパイルできるよりもgcc) 大規模なコード ベースがあり、その中に何百ものコードenumがあり、そのすべてに対してそのようなトリックを実行したくない場合は、たとえば GCC プラグインまたは拡張 (コードのGCC内の内部表現を使用して、enum宣言から同様の C コードを生成します。新しいソフトウェアをコーディングしている場合、またはソフトウェア ベースをよく知っている場合は、enumコードを同様のトリックに置き換えることができます。

于 2012-10-06T16:53:57.767 に答える