次のようなものを宣言すると
#define VAR 1
1 の値はどこに保存されますか? ヒープにもスタックにもないと思います..bssセクションにあるのでしょうか?
どこにも保存されていません。これは、コンパイルの前処理段階でのみ使用されます。これは、コード全体のVAR
withの単なるテキスト置換と考えることができます。1
これが完了すると、マクロ自体はプログラムに存在しなくなります。
次の例を検討してください。
#define VAR 1
int x = VAR;
これは単純に次のように前処理されます。
int x = 1;
このコードが C++ としてコンパイルされます。したがって、マクロVAR
はスペースをまったく占有しませんでした。ただし、によって定義されたオブジェクトx
は非常にうまくいくかもしれません。
は#define
純粋に前処理のアーティファクトです。マクロが使用されていない場合、その値はコンパイラにも届きません。使用されている場合、質問への答えは使用方法によって異なります。
ここで定義しているのはプリプロセッサのテキスト置換ルールだけであるため、実際に を使用する場所ならどこにでもVAR
保存されます。
#define VAR 1
int x = VAR;
ソースがコンパイルされる前に、プリプロセッサはこれを次のように減らします。
int x = 1;
この場合、1
値は に格納されx
ます。シンボルは、VAR
コンパイル前に効果的に消去されます。
gcc を使用している場合は、オプション -E で使用できます。このオプションを使用すると、実行された #defines の置換 (#includes なども含む) を含むソース コードの出力を確認できます。
gcc -E whatever_file.c
複雑なマクロをデバッグするときに非常に便利です
のみ#define VAR 1
です。そうだけ...定義します。メモリ割り当ては発生しません。定義された値 1 を使用してすべての発生を代用するためにプリプロセッサVAR
によってのみ使用されます。単なるテキストの概念です。
コンパイラは、オブジェクト コードが生成されている間に、プログラムで使用される # define 変数をすべて値に置き換えます。