在文件 xyz.c 中
int p=2; //global
#define sum(p,i) p+i
int main()
{
printf("%d", sum(5,6));
}
这里的输出是 11(而不是 8);为什么?
预处理发生在编译之前。当预处理器遇到 时sum
,它将用内容替换它,即您的代码转换为:
int main()
{
printf("%d", 5+6);
}
所以输出11
。预处理器不知道您的任何变量。
输出肯定是11
。
因为p
在宏内部不被视为变量,所以它就像一个具有调用值的令牌;例如(5,6)
。令牌的范围仅限于宏范围。
假设您将宏更改如下,那么输出将为 8:
#define sum(q,i) p+i
// ^^^ token 'q' is unused, so (5,6) is replaced with 'p+6'
如果您看到程序的 .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。