Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用宏是否会产生意外的输出?_C_Macros_Printf - Fatal编程技术网

C 使用宏是否会产生意外的输出?

C 使用宏是否会产生意外的输出?,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) {

在下面的代码中使用宏打印会在函数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)
{
     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在局部变量隐藏或隐藏全局变量时进行报告