30

これらのマクロはどのように評価されますか?

# define i 20
void fun();

int main(){
  printf("%d",i);
  fun();
  printf("%d",i);
  return 0;
}

void fun(){
  #undef i
  #define i 30
}

出力は 2020 ですが、一方で、

# define i 20
void fun(){
  #undef i
  #define i 30
}

int main(){
  printf("%d",i);
  fun();
  printf("%d",i);
  return 0;
}

出力は 3030 になります。説明してください。ありがとう。

4

7 に答える 7

2

マクロは、C プリプロセッサ ステージで評価されます。C プリプロセッサ ステージは、コンパイル ステージとは別に発生します。このため、マクロは通常のスコープに従いません。代わりに、ソース ファイルに表示される順序 (上から下) で評価されます。

最初のコード例では、メイン関数で fun() を呼び出して i の値を 30 に変更する必要があるにもかかわらず、2020 を出力しますが、呼び出された場所の下に fun 関数が表示されるため、値はプリプロセッサとして変更されません。まだその段階に達していません。

2 番目のコード例では、fun 関数が main 関数の上にあるため、3030 が出力されます。したがって、プリプロセッサがすでに fun 関数を通過し、i の値を 30 に変更しているため、反対のことが起こります。

于 2013-06-27T20:09:40.513 に答える