宏的范围在C?

如何评估这些宏?

# 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。
请解释。谢谢。

C预处理器从顶部到底部工作,而不管函数调用。从该点(线),无论宏定义的任何文件,直到对应的undef或直到翻译单元的结束,都是有效的。

所以,你的代码会变成,

# define i 20
               // from now on, all token i should become 20
void fun();
int main()
{
  printf("%d",i);   // printf("%d",20);
  fun();
  printf("%d",i);   // printf("%d",20);
  return 0;
}
void fun()
{
#undef i
              // from now on, forget token i
#define i 30
              // from now on, all token i should become 30
}

你的第二个代码会变成,

# define i 20
               // from now on, all token i should become 20
void fun()
{
#undef i
               // from now on, forget i
#define i 30
               // from now on, all token i should become 30
}
int main()
{
  printf("%d",i);    //  printf("%d",30);
  fun();
  printf("%d",i);    // printf("%d",30);
  return 0;
}
http://stackoverflow.com/questions/17349387/scope-of-macros-in-c

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:宏的范围在C?