c++ - 使 c++ 宏 2 包含宏 1 的引用主体

标签 c++ gcc c-preprocessor qmake

我正在尝试制作某种简单的系统来计算构建数量,包括 .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这样的东西但它只是扩展到 #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/

相关文章:

c++ - Eclipse "Type Not Resolved"问题

c - 使用gcc编译时出现错误1918

c - 对多个文件使用 gcc

c - 保持与内联函数的汇编的兼容性

c++ - 如何限制 C++ 中依赖于实现的语言特性的影响?

c++ - basic_string 的前导/尾随空格不敏感特征

c++ - 可视化标记条件编译

C++ #define 预处理器

c++ - 如何使用 SWIG 枚举枚举成员

c++ - isupper() 是宏还是函数?