使 C++ 宏 2 包含宏 1 的引号正文

Make c++ macro2 containt quoted body of macro1

本文关键字:正文 包含宏 C++      更新时间:2023-10-16

>我正在尝试制作某种简单的系统来计算构建数量,包括 .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 预处理器宏展开时,其参数将扩展为其文本参数,因此s将在展开QUOTE(s)参数A时扩展到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__)