使 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_STR
是 A
的字符串表示(这就是 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__)
我正在尝试制作某种简单的系统来计算构建数量,包括 .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
的 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__)