这是我在工作中遇到的一些代码的非常简化的版本:

#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/

10-11 22:55
查看更多