繁体   English   中英

使 C++ 宏 2 包含宏 1 的引用体

[英]Make c++ macro2 containt quoted body of macro1

我正在尝试制作某种简单的系统来计算构建数量,在 .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_STR成为A的字符串表示(这是windres希望在.rc 文件中看到的),但我找不到这样做的方法。

我已经尝试过像#define A_STR #A这样的#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__解决这个__VA_ARGS__

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM