首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用C#定义预处理器的作用域

用C#定义预处理器的作用域
EN

Stack Overflow用户
提问于 2011-06-17 06:49:49
回答 6查看 26.6K关注 0票数 24

#define的作用域一直到文件的末尾。但它是从哪里开始的。基本上,我尝试了以下代码。

代码语言:javascript
复制
 #include<stdio.h>
 #include<stdlib.h>
 #define pi 3.14
 void fun();
 int main()
{
 printf("%f \n",pi);
 #define pi 3.141516
    fun();
return 0;
}
void fun(){
printf("%f \n",pi);}

上述程序的输出结果如下

代码语言:javascript
复制
3.140000
3.141416

考虑到对main的预处理,pi的值应该是3.141516,而外部的main应该是3.14。这是不正确的,但请解释原因。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-06-17 07:01:03

C预处理器从上到下遍历整个文件,并将#define语句视为美化的复制粘贴操作。一旦遇到#define pi 3.14行,它就开始用3.14替换单词pi的每个实例。预处理器不会处理(甚至不会注意到)C语言的作用域机制,比如括号和大括号。一旦它看到#define,该定义就会一直有效,直到到达文件末尾,使用#undef取消定义宏,或者(就像本例中一样)使用另一个#define语句重新定义宏。

如果您想要符合C作用域规则的常量,我建议在const float pi = 3.14;行中使用更多的东西。

票数 27
EN

Stack Overflow用户

发布于 2011-06-17 06:53:55

#define的作用域是从出现的地方到文件(或相应的#undef)的结尾,而不考虑任何中间的C作用域。

票数 10
EN

Stack Overflow用户

发布于 2011-06-17 07:13:07

当您有预处理器问题时:

gcc -E foo.c > foo.i;vim foo.i

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

https://stackoverflow.com/questions/6379489

复制
相关文章

相似问题

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