使用宏会产生意想不到的输出?

时间:2015-02-15 20:33:10

标签: c macros printf

在下面的代码中使用宏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
}

1 个答案:

答案 0 :(得分:3)

通常,C中的所有内容都区分大小写,因此您的#define PRINT(X)宏具有X(大写)作为参数,但在替换中仅使用x(小写)。这不会导致错误,因为在扩展宏时范围内有x

也就是说,您的PRINT(z)会扩展为printf("%d\n", x),并根据要求打印x(即5)。

您的编译器可能有一个选项(在gcc和llvm中它是-E)来向您显示程序的预处理器版本。