の異なる名前、次のコード:(pedantic-errors
が無効になっている場合または警告)関数のようなマクロが、引数
#define MYDEF(x)
#define MYDEF(y)
int main() {}
は私にerrorを与える:
「MYDEF」マクロは
を再定義
なぜなら、使用されていない引数の名前が違うからです(もっと上に、マクロには本体がありません)。しかし、なぜ?どのような状況で問題になる可能性がありますか?
の異なる名前、次のコード:(pedantic-errors
が無効になっている場合または警告)関数のようなマクロが、引数
#define MYDEF(x)
#define MYDEF(y)
int main() {}
は私にerrorを与える:
「MYDEF」マクロは
を再定義
なぜなら、使用されていない引数の名前が違うからです(もっと上に、マクロには本体がありません)。しかし、なぜ?どのような状況で問題になる可能性がありますか?
マクロは機能ではないためです。それらはプリプロセッサによって行われるテキスト置換であり、オーバーロードすることはできません。
これは、エディタで検索して置換する(ほぼ)類似しています。 MYDEFのすべての出現箇所を見つけて(あなたの場合は空の文字列)に置き換えます。もちろん複雑ですが、考え方は同じです。
あなたはこの検索と置換をオーバーロードできません。 :)
マクロは再定義することができ、マクロはマクロ名によって一意に決まります。たとえば、次のようなコード:
#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。
標準では、マクロの複数の定義を同一にする必要があります。上記の2つの定義は同一ではありません。それらは同等ですが、標準では同一のものが必要です。別の定義で再定義する場合は、古いマクロを最初に '#undef'してください。 –