C中#define预处理器的范围

Roh*_*ain 14 c c-preprocessor

范围#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);}
Run Code Online (Sandbox Code Playgroud)

上述程序的输出结果如下

3.140000
3.141416
Run Code Online (Sandbox Code Playgroud)

考虑到主要的预处理,pi的值应该是3.141516并且在主3.14之外.这是不正确的,但请解释原因.

bta*_*bta 22

C预处理器从上到下运行文件,并将#define语句视为美化的复制和粘贴操作.一旦它遇到的线#define pi 3.14,它开始替换单词的每个实例pi3.14.预处理器不处理(或甚至注意)C语言范围机制,如括号和花括号.一旦看到a #define,该定义就会生效,直到达到文件末尾,宏未定义#undef,或者(如本例所示)宏用另一个#define语句重新定义.

如果你想要遵守C范围规则的常量,我建议使用更多的东西const float pi = 3.14;.

  • 请注意,例如const不会在开关标签中创建可用的常量:它创建一个只读对象。http://ideone.com/f3aON上的示例 (2认同)

Jim*_*wis 6

a的范围#define是从文件的出现到结尾,而不管任何介入的C范围.