2016-04-08 16 views
2

私のVisualスタジオでは、tag1とtag2の両方が未定義であると宣言されていますが、それらは明確に定義されています。別の#defineエラーに基づくC#define

#define push    99 
#define last_instruction push 

#ifdef DEBUG 
    #define new_instr (1+last_instruction) //should be 100 
    #undef last_instruction 
    #define last_instruction new_instr //redifine to 100 if debug 
#endif 

私はTAG2といくつかの例があり、それは定義がconstのでなければならないと言うが、それは+ 99 1で一定である、任意の助けいただければ幸いです。

ありがとうございます! BA

+0

[こちらを読む](http://stackoverflow.com/help/mcve) –

+0

「前処理されたファイルを生成する」オプション(/ P)を有効にして、何が起こっているのかを確認してください。 –

+0

おそらく '__COUNTER__'があなたを助けます。私は本当にtag2が必要なので、 – Dani

答えて

0

は私が思いついた提供解決策は完璧ではありませんが、私の場合に最適です。

この実装は、2つの形式で行うことができます。

将来の

あまり変化(変化だけ '最後の'):

#define push     99 
#define last     push 

#ifdef DEBUG 
    #define new_instr   (1+last) 
    #define last_instruction new_instr  
#else 
    #define last_instruction last 
#endif 

OR

クリアコードが、中に 'プッシュ' を繰り返し、 2つの場所

#define push     99 

#ifdef DEBUG 
    #define new_instr   (1+push) 
    #define last_instruction new_instr  
#else 
    #define last_instruction push 
#endif 

ありがとうございました。あなたが望むすべてが整数の定数のためのいくつかのシンボル名をある場合

4

まず、同じマクロを2回定義することはできません。あなたがマクロを交換する必要がある場合は、まずそれを#undefする必要があります。

#define tag1 99 
#ifdef DEBUG 
    #define tag2 (1+tag1) 
    #undef tag1 
    #define tag1 tag2 
#endif 

をしかし、これは問題を解決することはできません。マクロは変数ではなく、後で再利用するために値を格納するために使用することはできません。それらはテキスト置換であるため、並行して存在します。

したがって、新しい定義#define tag1 tag21+tag1に展開されます。しかし、この時点では、tag1と呼ばれるものはありません。なぜなら、これは未定義であり、まだ再定義していないからです。

ポンダーこの過ぎると、あなたは狂っ有効にします:)だから、あなたが本当にやりたいことはこれです、その全部忘れる:回答に基づいて

#define tag1_val 99 
#define tag1  tag1_val 

#ifdef DEBUG 
    #undef tag1 
    #define tag1 (tag1_val+1) 
#endif 
+0

は機能しません...電流: の#define TAG3 99 の#define TAG1のTAG3 の#ifdef DEBUGの#define tag_help \t \t(1 + TAG1) の#define TAG2 \t \t \t tag_help #undefのTAG1の#define TAG1 \t \t tag_help #endif – Buser

+0

@BrunoMiguelそれは、私が説明しようとした理由のためにどちらも動作しません。今度はtag2が必要な場合は、単に私のコードを使用し、 '#define tag2(tag1_val + 1)'を追加してください。 – Lundin

+0

私はすべての変数を熟考するために質問を編集します。私が本当に欲しいのは、tag1が最後のタグに基づいて動的になることです... – Buser

1

、あなたはこのようなenumでそれらを定義できます(DEBUGが定義されている場合)

enum { 
    push = 99, 
#ifdef DEBUG 
    new_instr, 
#endif 
    last_plus_1, 
    last_instr = last_plus_1 - 1 
}; 

new_instrが100になり、last_plus_1は、いずれかの101になります( DEBUGが定義されている場合)または100(DEBUGが未定義の場合)、last_instrは、last_plus_1未満の1になります。