2017-09-28 14 views
0

私はエラーを投げているいくつかのコードを持っています。私は自分自身を生成するためにマクロを使用しています。直感的な方法で文字列配列にアクセスするために使用できる文字列配列と列挙型です。私のコンパイラは私のマクロについて不平を言っていますが、私のコードの残りの部分はまるで私がかなり混乱している列挙体をマクロが正常に作成したかのように動作しているようです。これらのエラー列挙型エラー、変数宣言しません

struct phase_profile* set_defaults; 
set_defaults = AI_phases_get_name(PHASE_STRINGS[AI_phase_framerate]); 

せずにコンパイルすると思われる。しかし、コンパイラは

マクロ私のFOR_EACH_PHASEの各ラインのために私に次のエラーを与えているような

#define FOR_EACH_PHASE(PHASE)  \ 
      PHASE(init)   \ 
      PHASE(framerate) \ 
      PHASE(priority)  \ 
      PHASE(time)   \ 
      PHASE(powersave) \ 
      PHASE(performance) \ 
      PHASE(response) 

#define GENERATE_ENUM(ENUM) AI_phase_##ENUM, 
#define GENERATE_STRING(STRING) "AI_phase_"#STRING, 


typedef enum PHASE_ENUM PHASE_ENUM_t; 
enum PHASE_ENUM { 
    FOR_EACH_PHASE(GENERATE_ENUM) 
    END 
}; 

static const char* PHASE_STRINGS[] = { 
    FOR_EACH_PHASE(GENERATE_STRING) 
}; 

線をたどるよう

マクロです

error: 'performance' undeclared (first use in this function)

私よりこれについてもっと知っている人のアイデアはありますか?

乾杯

+0

なぜマクロを使用していますか? –

+0

"[...]直感的な方法で" - いいえ、少なくとも私には分かりません。 C言語でプログラムする場合は、C言語でプログラムしてみて、好きな言語に言語を曲げないようにしてください。 – unwind

+0

FOR_EACH_PHASEマクロは各フェーズの他のコードの生成にも使用されるため、マクロを使用しています。フェーズの数とその名前などは変更可能である必要があります。列挙型をハードコードすることはできますが、依然としてマクロ@EdHealが必要です –

答えて

0

私はので、私は答えとしてこれを掲示していますコメントするために必要な評判を持っていません。私は今、いくつかの年のためにそれを使用し、それは結構です

https://www.codeproject.com/Articles/32000/Improving-C-Enums-Adding-Serialization-Inheritance

私はあなたがこれを必要とすると信じて!

+0

返事をありがとう。これは正しい方向にあるようですが、私はhttps://stackoverflow.com/questions/9907160/how-to-convert-enum-names-to-string-in-cに似た何かを実装したいと考えていました 私コードは昨日カーネルモジュールにコンパイルされましたが、現在はアーキテクチャー/カーネル固有ではないより汎用的なコードをデバッグしようとしていますが、このマクロでビルドエラーが発生して混乱しています。 –

関連する問題