gpt4 book ai didi

c - 在子宏中替换父标记

转载 作者:行者123 更新时间:2023-11-30 16:20:03 24 4
gpt4 key购买 nike

我正在寻找替换被调用宏中的一些标记,但似乎无法确定扩展和/或延迟的正确顺序。例如:

#define EXPAND(...) __VA_ARGS__
#define REPLACE(hello,y) EXPAND(y)
REPLACE(goodbye, hello world)

在我看来,REPLACE 宏会调用 EXPAND 宏,使其在功能上与以下内容相同:

#define REPLACE(hello,y) hello world

允许 Hello World 转变为再见世界

我的编译器(MSVC 2017)似乎没有这样做,所以我怀疑我在这里错了。我已经阅读了扩展和延迟的内容,并尝试了 DEFER()EXPAND() 的许多不同组合,但似乎没有一个给出我想要的结果。

有人知道我做错了什么吗?

最佳答案

这不是宏参数的处理方式,这是有原因的。如果宏参数中宏参数名称的使用可以被替换,那么就不可能编写安全的宏:意外使用宏参数名称会导致困惑,并且宏调用者没有理由需要了解参数的名称是什么。宏参数是宏扩展的本地参数,类似于函数参数是函数体的本地参数。

这是实际的替换算法,来自 C 标准的 §6.10.3.1/1 [参数替换]:

After the arguments for the invocation of a function-like macro have been identified, argument substitution takes place. A parameter in the replacement list… is replaced by the corresponding argument after all macros contained therein have been expanded. Before being substituted, each argument’s preprocessing tokens are completely macro replaced as if they formed the rest of the preprocessing file; no other preprocessing tokens are available.

请注意,参数在放入宏扩展之前已被宏替换。完成此操作后,替换列表中的参数名称不再相关,并且不再是替换文本的一部分。

一旦宏调用被其扩展替换,就会再次扫描生成的标记(第 6.10.3.4 节:“然后重新扫描生成的预处理标记序列以及源文件的所有后续预处理标记,以获取更多信息)要替换的宏名称。”)。但是,由于宏调用在此重新扫描之前已被完全替换,因此参数标记不再出现。

因此,针对您的问题的这种特定解决方案是一个死胡同。我建议您退后一步,专注于您真正希望解决的问题。

关于c - 在子宏中替换父标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55418215/

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