gpt4 book ai didi

c++ - 宏参数的扩展在C++中如何工作

转载 作者:行者123 更新时间:2023-12-02 10:23:37 25 4
gpt4 key购买 nike

我只是注意到有关在C++中扩展宏参数的一件有趣的事情。

我定义了4个宏;其中2个将给定参数转换为字符串,另外2个尝试分离2个参数。我通过宏将其传递给参数,该宏扩展为,并得到以下结果:

#define Quote(x) #x
#define String(x) Quote(x)
#define SeparateImpl(first, second) first + second
#define Separate(pair) SeparateImpl(pair)
#define comma ,

int main(){
Quote(1 comma 2); // -> "1 comma 2"
String(1 comma 2); // -> "1 , 2"
SeparateImpl(1 comma 2); // -> 1 , 2 + *empty arg*
Separate(1 comma 2); // -> 1 , 2 + *empty arg*
return 0;
}

因此,正如我们所见,宏String变成了 "1 , 2",这意味着宏逗号首先被解压了。但是,宏Separate变成了 1 , 2 + **empty arg**,这意味着宏 comma尚未被首先解压缩,我想知道为什么吗?我在VS2019中尝试了这个。

最佳答案

#define Quote(x) #x
#define String(x) Quote(x)
#define SeparateImpl(first, second) first + second
#define Separate(pair) SeparateImpl(pair)
#define comma ,

宏调用的过程如下:
  • 参数替换(a.s),如果替换列表中提到一个参数,并且该参数不参与粘贴或字符串化,则将其完全扩展,并将替换列表中对该参数的提及替换为结果。
  • 字符串化
  • 粘贴
  • 重新扫描和进一步替换(r.a.f.r.),其中重新扫描生成的替换列表,在此期间宏的名称被标记为对扩展无效(“涂成蓝色”)。

  • 每种情况的扩展方式如下:
    Quote(1 comma 2)

    如。不执行任何操作(仅提及参数是字符串化)。字符串化适用。结果: "1 comma 2"
    String(1 comma 2)

    如。适用;产生 Quote(1 , 2)。在r.a.f.r.期间, Quote被标识为宏,但参数计数不匹配。这是无效的。但请参见下文。
    SeparateImpl(1 comma 2)

    无效的巨集 call 。正在使用一个参数来调用该宏,但是该宏应具有2个参数。在宏调用级别,您只是在查看 token 。
    Separate(1 comma 2)

    如。适用;产生 comma。在r.a.f.r.期间,调用了 SeparateImpl(1 , 2) ...该调用为a.s。适用,产生 SeparateImpl

    I tried this in VS2019.


    我可以一眼看出VS是2020年之前的事情,墙上的墙壁告诉我他们最终将致力于预处理程序的合规性。尤其是VS似乎处于一种奇怪的状态,尽管其中带有逗号的标记仍被视为单个参数(就好像参数识别发生在扩展之前但仍会继续应用一样)。因此,在这种情况下, 1 + 2就是您 1 , 2调用中的奇怪内容;即 String(1 comma 2)Quote一起调用,但在这种情况下,它实际上是一个参数。

    关于c++ - 宏参数的扩展在C++中如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57476237/

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