#ifおよび#define MY_MACRO(0)
#ifを使用すると、「define」マクロ、つまり、コード内で検索されて「(0)」に置き換えられるマクロが作成されたことを意味します。これは、コードを潜在的なコード変更で汚染するため、C ++で見たくない「マクロ地獄」です。
例えば:
#define MY_MACRO (0)
int doSomething(int p_iValue)
{
return p_iValue + 1 ;
}
int main(int argc, char **argv)
{
int MY_MACRO = 25 ;
doSomething(MY_MACRO) ;
return 0;
}
g ++で次のエラーが発生します。
main.cpp|408|error: lvalue required as left operand of assignment|
||=== Build finished: 1 errors, 0 warnings ===|
1つのエラーのみ。
これは、マクロがC ++コードと正常に相互作用したことを意味します。関数の呼び出しは成功しました。この単純なケースでは、それはおかしいです。しかし、自分のコードで黙って遊んでいるマクロに関する私自身の経験は、喜びと充足感に満ちていないので...
#ifdefおよび#define MY_MACRO
#ifdefを使用すると、何かを「定義」することになります。あなたがそれに値を与えるということではありません。それはまだ汚染されていますが、少なくとも、「何も置き換えられない」ため、C ++コードでは妥当なコードステートメントと見なされません。上記と同じコードで、単純に定義すると、次のようになります。
#define MY_MACRO
int doSomething(int p_iValue)
{
return p_iValue + 1 ;
}
int main(int argc, char **argv)
{
int MY_MACRO = 25 ;
doSomething(MY_MACRO) ;
return 0;
}
次の警告を表示します。
main.cpp||In function ‘int main(int, char**)’:|
main.cpp|406|error: expected unqualified-id before ‘=’ token|
main.cpp|399|error: too few arguments to function ‘int doSomething(int)’|
main.cpp|407|error: at this point in file|
||=== Build finished: 3 errors, 0 warnings ===|
そう...
結論
私はコードにマクロなしで生きたいと思っていますが、複数の理由(ヘッダーガードの定義、またはマクロのデバッグ)のために、それはできません。
しかし、少なくとも、正当なC ++コードを使用してインタラクティブ性を最小限に抑えたいと思っています。つまり、値なしで#defineを使用し、#ifdefと#ifndef(またはJim Buckによって提案されたように#ifで定義されていても)を使用し、何よりも長い間名前を付けることで、右心の誰も使用しないそれは「偶然」であり、正当なC ++コードに影響を与えることは決してありません。
後記
さて、私の投稿を再読しているときに、自分の定義に追加するために正しいC ++になることのない値を見つけようとするべきではないかと思います。何かのようなもの
#define MY_MACRO @@@@@@@@@@@@@@@@@@
これは#ifdefおよび#ifndefで使用できますが、関数内で使用するとコードをコンパイルできません...私はこれをg ++で正常に試行し、エラーが発生しました:
main.cpp|410|error: stray ‘@’ in program|
面白い。:-)
#if
使用#elif
すると、とは異なり、一貫した方法で使用することもできます#ifdef
。したがって、単にを#define BLAH
使用する代わりに、#define BLAH 1
と一緒#if BLAH
に使用するなど