ファイル xyz.c 内
int p=2; //global
#define sum(p,i) p+i
int main()
{
printf("%d", sum(5,6));
}
ここでの出力は 11 になります (8 ではありません)。なぜ?
前処理はコンパイル前に行われます。プリプロセッサがに遭遇するとsum
、それをコンテンツに置き換えます。つまり、コードは次のように変換されます。
int main()
{
printf("%d", 5+6);
}
したがって、出力します11
。プリプロセッサは、どの変数についても認識していません。
出力は間違いなく11
です。
マクロ内の変数とは見なされないためp
、呼び出し値を持つトークンのようなものです。例:(5,6)
。トークンのスコープはマクロスコープに制限されています。
以下のようにマクロを変更すると、出力は8になります。
#define sum(q,i) p+i
// ^^^ token 'q' is unused, so (5,6) is replaced with 'p+6'
プログラムの.i(中間ファイル)を見るとわかる問題です。プログラムから実行可能ファイルへのステップには、次のようないくつかのステップが含まれます。
1.preprocessing
2.compilation
3.assembler for object code
4.linking
最初のステップ -preprocessing には次のコマンドを使用します
cpp <your program>.c -o <any name to output>.i
これを実行すると、プログラムの .i ファイルが表示されます。次のように表示されます。
int p=2;
int main()
{
printf("%d", 5 +6);
}
すべてのプリプロセッサが最初に指定した値を置き換えてからコンパイルが行われるため、答えが 11 である理由がはっきりとわかります。そのため、前処理後にグローバル p に使用される 'p' はありません。プログラムで使用します。
11の答えが得られました。