C中#define预处理器的范围
#define
的范围直到文件末尾。 但它从哪里开始。 基本上我尝试了以下代码。
#include #include #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
考虑到主要的预处理,pi的值应该是3.141516并且在主3.14之外。 这是不正确的,但请解释原因。
C预处理器从上到下运行文件,并将#define
语句视为美化的复制和粘贴操作。 一旦遇到#define pi 3.14
,它就开始用#define pi 3.14
替换单词pi
每个实例。 预处理器不处理(或甚至注意)括号和花括号等C语言范围机制。 一旦看到#define
,该定义就会生效,直到达到文件的末尾,用#undef
取消定义宏,或者(如本例所示)用另一个#define
语句重新定义宏。
如果你想要遵守C范围规则的常量,我建议在const float pi = 3.14;
的行上使用更多的东西const float pi = 3.14;
。
#define
的范围是从文件的出现到结尾,而不管任何介入的C作用域。
预处理器没有“范围”的概念 – 它操纵程序的文本,而不知道文本是什么
符号从其定义定义到编译单元结束(源文件及其包含的文件)
当您有预处理器问题时:
gcc -E foo.c> foo.i; vim foo.i
据我所知,预处理器按照它们遇到的顺序使用#define
语句。 在这种情况下,你的第一个printf
语句正确打印3.14和第二个3.141516(你的程序输出中是否有拼写错误?)。