2016-03-28 16 views
0

の異なる名前、次のコード:(pedantic-errorsが無効になっている場合または警告)関数のようなマクロが、引数

#define MYDEF(x) 
#define MYDEF(y) 
int main() {} 

は私にerrorを与える:

「MYDEF」マクロは

を再定義

なぜなら、使用されていない引数の名前が違うからです(もっと上に、マクロには本体がありません)。しかし、なぜ?どのような状況で問題になる可能性がありますか?

+2

標準では、マクロの複数の定義を同一にする必要があります。上記の2つの定義は同一ではありません。それらは同等ですが、標準では同一のものが必要です。別の定義で再定義する場合は、古いマクロを最初に '#undef'してください。 –

答えて

7

マクロは機能ではないためです。それらはプリプロセッサによって行われるテキスト置換であり、オーバーロードすることはできません。

これは、エディタで検索して置換する(ほぼ)類似しています。 MYDEFのすべての出現箇所を見つけて(あなたの場合は空の文字列)に置き換えます。もちろん複雑ですが、考え方は同じです。

あなたはこの検索と置換をオーバーロードできません。 :)

0

マクロは再定義することができ、マクロはマクロ名によって一意に決まります。たとえば、次のようなコード:

#define MYDEF(x) //the name of the macro is 'MYDEF' 
#define MYDEF(x, y) //the name of the macro is 'MYDEF' too 

MYDEF(x)MYDEF(x, y)によってredifined(またはカバー)され、あなたがコードを書く場合、あなたは、そうMYDEF(x, y)

を定義した後、それ以上のコードMYDEF(x)を記述することはできません。

#define MYDEF(x) 
#define MYDEF(y) //(There compiler will give warning). You can write 
        //`#undef MYDEF` before `#define MYDEF(y)` to avoid it. 

MYDEF(x)はによってredifinedされます3210。

関連する問題