【发布时间】:2015-02-15 20:33:09
【问题描述】:
在下面的代码中使用宏 PRINT 会在函数 q 中产生意外输出。为什么使用宏 PRINT(z) 会产生 5 而使用 printf 会产生 12?
#include<stdio.h>
#define PRINT(X) printf("%d\n",x)
int x;
void q(int z)
{
z+=x;//7+5=12
printf("%d\n",z);// here 12 it s good
PRINT(z); // why 5 here?
}
void p(int *y)
{
int x;
x=*y+2;
q(x);
*y=x-1;
printf("%d\n",x);// 7 it is good
PRINT(x); // 7 it is good
}
int main()
{
x=5;
p(&x);
printf("%d\n",x);// 5 good
PRINT(x); // 5 good
}
【问题讨论】:
-
请注意,
q()中的代码没有全局变量x将无法编译。p()中的局部变量x隐藏了全局变量;这通常是个坏主意。 GCC 支持-Wshadow报告局部变量何时隐藏或隐藏全局变量。 -
又一个为什么全局变量是邪恶的例子