首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >宏在C中的作用域?

问宏在C中的作用域?
EN

Stack Overflow用户
提问于 2013-06-28 01:16:43
回答 7查看 10.6K关注 0票数 30

这些宏是如何计算的?

代码语言:javascript
复制
# define i 20
void fun();

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

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

给出了2020年的产出,但

代码语言:javascript
复制
# define i 20
void fun(){
  #undef i
  #define i 30
}

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

输出为3030。请解释一下。谢谢。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-06-28 01:19:51

无论函数调用如何,C预处理器都能在自上而下的中工作。它从定义宏文件中的点(行)开始有效,直到相应的undef或翻译单元结束为止。

所以,你的代码会变成,

代码语言:javascript
复制
# 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
}

你的第二个代码会变成,

代码语言:javascript
复制
# 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;
}
票数 60
EN

Stack Overflow用户

发布于 2013-06-28 01:20:11

根本不涉及作用域。宏是在预处理阶段独立于编译阶段处理的,没有C作用域的概念。您的示例可以很容易地实现:

代码语言:javascript
复制
#define i 20

void fun();

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

void fun()
{
}

#undef i
#define i 30

和:

代码语言:javascript
复制
#define i 20
#undef i
#define i 30

void fun()
{
}

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

你可以从这些中看出为什么它会这样做。

票数 18
EN

Stack Overflow用户

发布于 2013-06-28 01:20:16

根本就没有余地。

宏由预处理器替换。因此,它们的扩展是由它们在源中的位置定义的,从上到下。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17349387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档