4

C/C++ では、または[C++] でも簡単に作成できるのに、#define[and ] を使用して値を作成することの違いは何ですか?#ifndef #endifintstd::string

#ifndef MYVAL
#define MYVAL(500)
#endif

//C++

cout << MYVAL << endl;

//C

printf(MYVAL);

//C++

int MYVAL = 500;
cout << MYVAL << endl;

//C
int MYVAL = 500;
printf(MYVAL);
4

6 に答える 6

5

違いは、マクロ (#) を使用すると、プリプロセッサがそのシンボルを検索して置換することです。置換の型チェックはありません。

変数を作成すると型付けされ、コンパイラは変数を使用する場所で型チェックを行います。

C/C++ コンパイラは、2 パス コンパイラと見なされることがよくあります。最初のパスは、マクロの検索と置換を行うプリプロセッサです。2 番目のパスは、宣言された変数が作成される実際のコンパイルです。

マクロは、より複雑な式を作成するためによく使用されるため、コードを複数回繰り返す必要がなく、構文がよりコンパクトになります。それらは便利ですが、「盲目的」な検索と置換の性質のため、より危険でもあります。さらに、デバッガーを使用してマクロにステップ インすることはできないため、トラブルシューティングが難しくなる可能性があります。

また、マクロはスコープ規則には従いません。 #define MYVAL(500)関数、グローバルスコープ、クラス宣言などで発生した場合でもに置き換えMYVALられる500ため、そのようにもっと注意する必要があります。

于 2013-11-14T17:14:54.057 に答える
2

あなたが#define何かをすると、それがあなたのコードで見つかるたびに盲目的に置き換えられます:

#define the_answer 42
/// ...

int the_answer = /* oops! */
于 2013-11-14T17:18:26.843 に答える
2

#defines を使用すべきではない重要な理由はいくつかあります。特にあなたの質問については、 #define はプレーンテキストの置換であり、マクロの範囲を制限することはできません。つまり、アクセス指定子を指定したり、名前空間にバインドしたりすることはできません。そのため、マクロを定義すると、define が含まれるファイル内のどこでもマクロを使用できます。

「const」変数を使用すると、それらをスコープにバインドできます

これらが役立ちます:http://www.parashift.com/c++-faq/const-vs-define.html

http://www.parashift.com/c++-faq/preprocessor-is-evil.html

于 2013-11-14T17:19:38.250 に答える