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

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_STRA 的字符串表示(这就是 windres 希望在 .rc 文件中看到的),但我找不到方法去做这个。

我已经尝试过类似 #define A_STR #A 的 smth,但它只是扩展到 #0,0,0,1

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

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

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

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

然而,这实际上对你的情况不起作用,因为在第一级扩展中 A 将扩展为 0,0,0,1,这将被视为 [=23= 的四个参数],因此将被拒绝为无效的宏调用。

您可以使用可变宏参数和 __VA_ARGS__:

来解决这个问题
#define QUOTE2(...) #__VA_ARGS__
#define QUOTE(...) QUOTE2(__VA_ARGS__)