宏中变量的范围

问题描述 投票:0回答:3

在文件 xyz.c 中

int p=2;  //global

#define sum(p,i) p+i

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

此处的输出将为 11(而不是 8);为什么?

c++ c macros scope
3个回答
9
投票

预处理发生在编译之前。当预处理器遇到

sum
时,它会将其替换为内容,即您的代码翻译为:

int p=2; //global

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

所以输出

11
。预处理器不知道您的任何变量。


4
投票

输出绝对是

11

因为
p
在宏内部不被视为变量,它就像一个具有调用值的标记;例如
(5,6)
。代币的范围仅限于宏观范围。

假设您将宏更改如下,那么输出将为 8:

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

3
投票

如果您看到程序的.i(中间文件),您就可以看到问题。程序可执行的步骤包括以下一些步骤

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。

© www.soinside.com 2019 - 2024. All rights reserved.