如何将CFLAGS中定义的GCC预处理器变量组合为字符串字面量?
解决方案
你的问题出在直接用##做token拼接,却没先把预处理器变量转为字符串字面量,也没正确展开宏参数。以下是两种场景的可行方案:
场景1:CFLAGS中定义的变量不带引号(如-D X=string1 -D Y=string2)
需要先将宏参数展开并转换为字符串,再利用C语言相邻字符串字面量自动合并的特性组合:
// 辅助宏:将参数直接转为字符串 #define _STR(x) #x // 辅助宏:先展开宏参数,再转为字符串 #define STR(x) _STR(x) // 组合两个字符串 #define COMBINED STR(X) STR(Y)
使用时,COMBINED会被预处理器展开为"string1""string2",最终编译器会合并为"string1string2",直接用printf("%s", COMBINED);即可输出正确结果。
场景2:CFLAGS中定义的变量带引号(如-D X="hello" -D Y="world")
此时无需额外转换,直接让两个字符串字面量相邻即可:
#define COMBINED X Y
预处理器展开后会得到"hello""world",编译器同样会自动合并为"helloworld"。
内容的提问来源于stack exchange,提问作者Amirfel
相关产品推荐
相关产品推荐

