这是我在工作中遇到的一些代码的非常简化的版本:
#include <stdio.h>
#define F(G) G(1)
#define G(x) x+1
int main() {
printf("%d\n", F(G));
}
打印2。
现在,我可以看到F(G)扩展为G(1),然后G(1)扩展为2,但是我不清楚为什么。我本来希望从printf行得到G不是函数的错误。
预处理程序如何解析这样的代码?
最佳答案
只有在函数名称后跟一个(
时,才会调用类似函数的宏。
在F(G)
中,G
后没有(
,因此G
中没有宏调用。
在F(G) G(1)
中,G
是宏参数,因此不能直接宏替换(这是一个非常令人困惑的宏:-O)。在G(1)
中,将G
替换为与参数G
对应的参数,该参数也恰好是G
。然后重新扫描该替换,并将G(1)
评估为1 + 1
。
如果我们重写您的宏,以便您不会以多种不同的方式使用G
,那么它将更容易理解:
#define F(x) x(1)
#define G(x) x + 1
在此,
F(G)
替换为G(1)
。然后对其进行重新扫描,并评估G
的调用,生成1 + 1
。关于c - C预处理器将标识符视为类似于对象而不是类似于函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8144995/