1

次のようなものを宣言すると

#define VAR 1

1 の値はどこに保存されますか? ヒープにもスタックにもないと思います..bssセクションにあるのでしょうか?

4

6 に答える 6

9

どこにも保存されていません。これは、コンパイルの前処理段階でのみ使用されます。これは、コード全体のVARwithの単なるテキスト置換と考えることができます。1これが完了すると、マクロ自体はプログラムに存在しなくなります。

次の例を検討してください。

#define VAR 1
int x = VAR;

これは単純に次のように前処理されます。

int x = 1;

このコードが C++ としてコンパイルされます。したがって、マクロVARはスペースをまったく占有しませんでした。ただし、によって定義されたオブジェクトxは非常にうまくいくかもしれません。

于 2013-04-10T20:05:58.730 に答える
3

#define純粋に前処理のアーティファクトです。マクロが使用されていない場合、その値はコンパイラにも届きません。使用されている場合、質問への答えは使用方法によって異なります。

于 2013-04-10T20:06:04.300 に答える
2

ここで定義しているのはプリプロセッサのテキスト置換ルールだけであるため、実際に を使用する場所ならどこにでもVAR保存されます。

#define VAR 1
int x = VAR;

ソースがコンパイルされる前に、プリプロセッサはこれを次のように減らします。

int x = 1;

この場合、1値は に格納されxます。シンボルは、VARコンパイル前に効果的に消去されます。

于 2013-04-10T20:05:56.607 に答える
1

gcc を使用している場合は、オプション -E で使用できます。このオプションを使用すると、実行された #defines の置換 (#includes なども含む) を含むソース コードの出力を確認できます。

gcc -E whatever_file.c

複雑なマクロをデバッグするときに非常に便利です

于 2013-04-10T20:34:28.910 に答える
1

のみ#define VAR 1です。そうだけ...定義します。メモリ割り当ては発生しません。定義された値 1 を使用してすべての発生を代用するためにプリプロセッサVARによってのみ使用されます。単なるテキストの概念です。

于 2013-04-10T20:07:29.780 に答える
1

コンパイラは、オブジェクト コードが生成されている間に、プログラムで使用される # define 変数をすべて値に置き換えます。

于 2013-04-10T20:08:30.270 に答える