我正在尝试制作某种简单的系统来计算构建数量,包括 .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
这样的东西但它只是扩展到 #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++ 宏 2 包含宏 1 的引用主体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30828953/