使 C++ 宏 2 包含宏 1 的引号正文
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 预处理器宏展开时,其参数将扩展为其文本参数,因此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__)
相关文章:
- 在使用包含冒号的类似函数的宏时,是什么导致了这种编译器差异?
- C/C++ 包含点的宏参数(成员访问运算符)
- VS2015 / 2017中的TRACE宏无法编译 - 我需要包含什么?
- 内联和通过宏包含源之间的区别
- GCC Bug,使用尖括号通过宏包含标头时"linux"路径中的字符串"<>"替换为 "1"
- 标准目录中包含的文件可以静默替换现有宏
- C++包含返回的宏表达式(如 Rust 的尝试!
- GCC - 包含编译标志的宏
- 包含 comptime 断言的整数常量表达式宏
- 编辑包含目录 Visual Studio 2010 的宏
- #包含从宏__file__派生的文件
- 为什么宏__STL_FUNCTION_MPL_PARTIAL_ORDER应该将模板函数包含在std_pair.h中
- 不能传递宏中包含各种字符的g++
- 有没有一种方法可以通过宏来检测标准标头是否包含在其中
- 如何定义用于包含文件的C++宏
- 重新排序包含目录如何解决宏重定义问题
- 如何在我的 for 循环宏中包含多个语句
- 我们是否应该在.h和.cpp文件中都包含一个宏(#define)
- 如何在C/ c++中包含宏的行末尾添加语句
- 使 C++ 宏 2 包含宏 1 的引号正文