#define的作用域一直到文件的末尾。但它是从哪里开始的。基本上,我尝试了以下代码。
#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);}上述程序的输出结果如下
3.140000
3.141416考虑到对main的预处理,pi的值应该是3.141516,而外部的main应该是3.14。这是不正确的,但请解释原因。
发布于 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;行中使用更多的东西。
发布于 2011-06-17 06:53:55
#define的作用域是从出现的地方到文件(或相应的#undef)的结尾,而不考虑任何中间的C作用域。
发布于 2011-06-17 07:13:07
当您有预处理器问题时:
gcc -E foo.c > foo.i;vim foo.i
https://stackoverflow.com/questions/6379489
复制相似问题