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(你的程序输出中是否有拼写错误?)。