[英]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.