gpt4 book ai didi

c++ - 使 c++ macro2 包含 macro1 的引用主体

转载 作者:搜寻专家 更新时间:2023-10-31 02:22:00 25 4
gpt4 key购买 nike

我正在尝试制作某种简单的系统来计算构建数量,包括 .rc 文件中的此信息(适用于 Windows)并遇到了问题。在这里:

#define QUOTE(s) #s
#define A 0,0,0,1
#define A_STR QUOTE(A)

A_STR 的扩展:"A"但不是 "0,0,0,1"正如我所料。

嗯,我需要A_STRA 的字符串表示形式(这就是 windres 希望在 .rc 文件中看到的内容),但我找不到执行此操作的方法。

我已经试过类似#define A_STR #A 的东西了但它只是扩展为 #0,0,0,1 .

我也试过像这样使用 qmake:DEFINES *= A_STR="<here-is-how-I-get-version>"但是gcc得到它没有引号,我遇到了同样的问题。

最佳答案

当 C 预处理器宏被扩展时,它的参数被扩展为它们的文字参数,所以 s 将被扩展为 A 当你的 QUOTE(s) 接受参数 A 被扩展。通常,在展开完成后,展开的文本将被再次扫描以展开其中嵌入的任何宏,因此这会导致 A 展开为 0, 0,0,1。但是,当字符串化运算符 # 用于对以下文本进行字符串化时,该字符串化首先发生,因此后续文本永远没有机会展开,因此您得到字符串化 "A" 作为 A_STR 的最终扩展。

这个问题通常通过引入第二层间接来解决,这给了初始宏参数第二次扩展的机会:

#define QUOTE2(A) #A
#define QUOTE(A) QUOTE2(A)

但是,这实际上对您的情况不起作用,因为在第一级扩展中,A 将扩展为 0,0,0,1,这将被视为 QUOTE2() 的四个参数,因此将被拒绝为无效的宏调用。

您可以使用可变宏参数和 __VA_ARGS__ 解决此问题:

#define QUOTE2(...) #__VA_ARGS__
#define QUOTE(...) QUOTE2(__VA_ARGS__)

关于c++ - 使 c++ macro2 包含 macro1 的引用主体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30828953/

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