宏中变量的范围

时间:2012-10-04 05:36:35

标签: c++ c macros scope

在xyz.c文件中

int p=2;  //global

#define sum(p,i) p+i

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

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

3 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:4)

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

假设您按如下所示更改宏,则输出将为8:

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

答案 2 :(得分:2)

如果您看到程序的.i(intermadiate文件),则可以看到问题。程序可执行的步骤包括以下步骤

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。