#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 defined) を使用し、そして何よりも、それらに非常に長い名前を付けることを意味します。これは「たまたま」であり、正規の C++ コードに影響を与えることは決してありません。
ポスト スクリプトム
今、自分の投稿を読み直していて、自分の定義に追加する正しい C++ ではない値を見つけようとするべきではないのではないかと思います。何かのようなもの
#define MY_MACRO @@@@@@@@@@@@@@@@@@
#ifdef および #ifndef で使用できますが、関数内で使用するとコードをコンパイルできません... g ++でこれを正常に試したところ、エラーが発生しました:
main.cpp|410|error: stray ‘@’ in program|
面白い。:-)