我试图建立一个简单的系统来计算构建的数量,包括.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没有引用它,我也遇到了同样的问题。
发布于 2015-06-14 12:07:41
当展开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__)https://stackoverflow.com/questions/30828953
复制相似问题