如何通过C语言宏实现两个字面量C字符串的编译期拼接
问题解答
结论
C语言原生支持编译期字符串拼接,无需自定义特殊语法,也不存在任何运行时开销。
实现原理
C标准(C89及后续所有标准)明确规定:相邻的字符串字面量会在编译阶段自动完成拼接,整个过程由编译器处理,运行时直接使用拼接完成的常量字符串,不需要执行任何字符拷贝、拼接逻辑。
修正后的示例代码
你设想的!"自定义语法完全不需要,原生写法如下:
#define VERSION_CODE "1.0" // 直接把参数和版本字符串相邻放置,编译器会自动拼接 #define ADD_VERSION(base) (base " " VERSION_CODE) int main() { // 预处理展开后为 printf(("MyProgram" " " "1.0")); // 编译期自动拼接为 "MyProgram 1.0" 常量 printf(ADD_VERSION("MyProgram")); return 0; }
扩展场景:参数为不带引号的标识符
如果希望调用宏时不需要手动给参数加引号,可以结合预处理器的#字符串化操作符实现,示例如下:
#define VERSION_CODE "1.0" // #base 会在预处理阶段将base参数转为带引号的字符串字面量 #define ADD_VERSION(base) (#base " " VERSION_CODE) int main() { // 不需要给MyProgram加引号,预处理后自动转为"MyProgram 1.0" printf(ADD_VERSION(MyProgram)); return 0; }
内容的提问来源于stack exchange,提问作者Alex A.
相关产品推荐
相关产品推荐

