下面两个程序给出不同的结果。我认为这两个程序应该给出与 20..20 相同的结果,因为宏定义在 fun() 中,它不应该影响 fun() 之外。能解释一下原因吗?
A:结果是 20..20
# include <stdio.h>
# define i 20
void fun();
main()
{
printf("%d..", i);
fun();
printf("%d", i);
}
void fun()
{
#undef i
#define i 30
}
B:结果是 30..30
# include <stdio.h>
# define i 20
void fun()
{
#undef i
#define i 30
}
main()
{
printf("%d..", i);
fun();
printf("%d", i);
}
最佳答案
C 预处理器不是编译器的一部分,而是编译过程中的一个单独步骤。
现在,因为它是编译过程中的一个单独步骤,所以它与为 i
分配不同的值不同。当您的代码运行时,它将 i
视为 20
,因为它是在 main
之前定义的。但是,正如我所说,这是一个单独的步骤,并且它不关心函数范围,因此,在 main 之前 (i=20
) 和main 之后 (i=30
)。当预处理器运行时,它将整个范围视为全局范围。
尝试在主函数中使用#define
,而不是在函数中,然后检查会发生什么...
示例:
void f(){
#define a 5
printf("%d\n", a);
#undef a
#define a 10
printf("%d\n", a);
}
int main()
{
printf("%d\n", a); // a can be printed even though f() was never called!!
#define i 20
printf("%d\n", i); // 20
#undef i
#define i 30
printf("%d\n", i); // 30! :)
return 0;
}
您可以在此 Q&A 中找到更多信息
关于c - 在函数中定义宏值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45049135/