在下面的代码中使用宏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
}
答案 0 :(得分:3)
通常,C中的所有内容都区分大小写,因此您的#define PRINT(X)
宏具有X
(大写)作为参数,但在替换中仅使用x
(小写)。这不会导致错误,因为在扩展宏时范围内有x
。
也就是说,您的PRINT(z)
会扩展为printf("%d\n", x)
,并根据要求打印x
(即5)。
您的编译器可能有一个选项(在gcc和llvm中它是-E
)来向您显示程序的预处理器版本。