最终更新:
在阅读了许多相关的问题和答案后,我觉得答案很简单,尽管令人失望:在预处理器中不可能连接字符串文字。添加宏到组合并没有改变这一点,它只会混淆图片。
我稍后会删除这个问题,除非有人说上面的是错误的。
我试图从几个字符串文字和一些宏定义一个字符串文字。
是的,我知道相邻的字符串字面量是由编译器连接的。这里有数百个问题“如何在预处理器中连接字符串”,它们都有相当多的the same answer。但它并没有回答真正的问题。
我正在尝试这样做(下面的代码只是一个提示,它需要第二层参数化宏来实际编译)
#define A 1
#define B 2
#define STR1 "Up\r" #A "\r" #B "\r"
#define STR2 "Down\r" #B "\r" #A "\r"
char* strings[] = { STR1, STR2 };
在这个例子中,当我在IDE中检查STR 1宏扩展时,我希望看到"Up\r1\r2\r"
,而不是"Up\r" "1" "\r" "2" "\r"
。
更新:
下面的示例显示IDE完全能够显示合并的宏,在这种情况下,STR1上的宏扩展显示“12”。只有当我试图将字符串文字添加到混合中时,我才会遇到问题。
#define CON1(a,b) a ## b
#define CON2(a,b) CON1(a,b)
#define STR1 CON2(A,B)
我的问题是:是否可以在预处理器中连接字符串和宏,以获得最终的字符串文字作为一个完整的字符串?
2条答案
按热度按时间l7wslrjt1#
你试过stringizing吗?
在我的Ubuntu 20上,它打印:
s5a0g9ez2#
**否。**相邻字符串的连接发生在第6阶段,而预处理发生在第4阶段。
您没有提到您使用的是哪个IDE,但是您可以提交一个功能请求,该请求可以选择将扩展的宏的字符串连接起来。但是,它不应该是默认选项,因为如果是这样的话,IDE就会在宏精确扩展到什么方面对您撒谎。