【问题标题】:Scope of variable in a macro宏中的变量范围
【发布时间】:2012-09-25 02:41:00
【问题描述】:

在文件 xyz.c 中

int p=2;  //global

#define sum(p,i) p+i

int main()
{
    printf("%d", sum(5,6));
}

这里的输出是 11(而不是 8);为什么?

【问题讨论】:

  • 不能试试看输出吗?
  • @chris 我也想要原因

标签: c++ c macros scope


【解决方案1】:

预处理发生在编译之前。当预处理器遇到sum 时,它会将其替换为内容,即您的代码转换为:

int main()
{
   printf("%d", 5+6);
}

所以输出11。预处理器不知道您的任何变量。

【讨论】:

    【解决方案2】:

    输出肯定是11
    因为p在宏内部不被视为变量,所以它就像一个具有调用值的token;例如(5,6)。令牌的范围仅限于宏范围。

    假设你改变宏如下,那么输出将是8:

    #define sum(q,i) p+i
          //   ^^^ token 'q' is unused, so (5,6) is replaced with 'p+6'
    

    【讨论】:

      【解决方案3】:

      如果你看到你的程序的.i(intermadiate file)你可以看到的问题。程序执行的步骤包括以下一些步骤

      1.preprocessing
      2.compilation
      3.assembler for object code
      4.linking
      

      使用如下命令进行第一步-预处理

      cpp <your program>.c -o <any name to output>.i

      如果你这样做,那么在执行之后你可以看到你的程序的 .i 文件,你会看到如下

      int p=2;
      
      
      
      int main()
      {
          printf("%d", 5 +6);
      }
      

      答案是 11 的原因显而易见,因为所有预处理器都会替换您首先给出的值,然后编译完成,因此在预处理后没有用于全局 p 的“p”。没有 p 用于在程序中使用的后续步骤。

      所以你得到了答案 11。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-04
        • 1970-01-01
        • 1970-01-01
        • 2017-07-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多