首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使c++ macro2包含macro1的引文正文

使c++ macro2包含macro1的引文正文
EN

Stack Overflow用户
提问于 2015-06-14 11:44:38
回答 1查看 60关注 0票数 2

我试图建立一个简单的系统来计算构建的数量,包括.rc文件中的这个信息(对于windows),并遇到了这个问题。下面是:

代码语言:javascript
复制
#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没有引用它,我也遇到了同样的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-14 12:07:41

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

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

代码语言:javascript
复制
#define QUOTE2(A) #A
#define QUOTE(A) QUOTE2(A)

但是,这实际上并不适用于您的情况,因为在第一级扩展中,A将扩展到0,0,0,1,这将被视为QUOTE2()的四个参数,因此将被拒绝为无效的宏调用。

您可以使用各种宏参数和__VA_ARGS__来解决这个问题。

代码语言:javascript
复制
#define QUOTE2(...) #__VA_ARGS__
#define QUOTE(...) QUOTE2(__VA_ARGS__)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30828953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档