C 使用宏是否会产生意外的输出?
在下面的代码中使用宏打印会在函数q中产生意外的输出。为什么使用宏PRINTz生成5,而使用printf生成12C 使用宏是否会产生意外的输出?,c,macros,printf,C,Macros,Printf,在下面的代码中使用宏打印会在函数q中产生意外的输出。为什么使用宏PRINTz生成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) {
#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
}
通常,C中的所有内容都区分大小写,因此define PRINTX宏的参数为X大写,但在替换中仅使用X小写。这不会导致错误,因为在宏展开时,作用域中有一个x 也就是说,PRINTz扩展为printf%d\n,x,并按要求打印x,即5
您的编译器可能在gcc和llvm-it's-E中有一个选项,可以向您显示程序的后预处理器版本。请注意,如果没有全局变量x,q中的代码将无法编译。p中的局部变量x隐藏全局变量;这通常是个坏主意。GCC支持-Wshadow在局部变量隐藏或隐藏全局变量时进行报告