gpt4 book ai didi

C 预处理器将标识符视为类对象而不是类函数

转载 作者:行者123 更新时间:2023-12-01 08:55:13 24 4
gpt4 key购买 nike

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

#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,但我不清楚原因。我本以为会得到一个错误,即 G 不是 printf 行中的函数。

预处理器如何解析这样的代码?

最佳答案

类函数的宏只有在其名称后跟(

F(G)中,G后面没有(,所以G有不是宏调用。

F(G) G(1) 中,G 是一个宏参数,因此不会直接被宏替换(这是一个非常令人困惑的宏去)。 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 预处理器将标识符视为类对象而不是类函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8144995/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com