【问题标题】:Use of macro is producing unexpected output?使用宏会产生意外的输出?
【发布时间】: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 报告局部变量何时隐藏或隐藏全局变量。
  • 又一个为什么全局变量是邪恶的例子

标签: c macros printf


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-21
    • 2017-03-19
    • 1970-01-01
    相关资源
    最近更新 更多