如何定义PRINT_SIG宏实现带线程名前缀的printf输出?
问题描述
现有变量定义:
const char *thread_name = "THREAD_1";
需要定义一个名为PRINT_SIG(sig)的宏,使得执行语句:
printf(PRINT_SIG(thread_name)" Hello I am a thread");
输出结果为:
[THREAD_1] Hello I am a thread
补充说明:thread_name的值在编译时未知,其数字后缀由启动的线程数量决定,示例仅作简化展示。
可行解决方案
由于thread_name是运行时确定的变量(非编译期字符串字面量),无法直接通过宏实现字符串拼接。我们可以利用C语言中相邻字符串字面量自动拼接的特性,结合printf的格式占位符来实现需求:
宏定义
#define PRINT_SIG(sig) "[%s] "
调用方式
调整printf的写法,将thread_name作为参数传入:
printf(PRINT_SIG(thread_name) " Hello I am a thread", thread_name);
原理说明
宏展开后,代码会变成:
printf("[%s] " " Hello I am a thread", thread_name);
C编译器会自动将相邻的字符串字面量拼接为一个完整的格式串:"[%s] Hello I am a thread",最终printf会用thread_name的值替换%s,输出符合要求的结果。
注意事项
你原本期望的调用形式printf(PRINT_SIG(thread_name)" Hello I am a thread");无法直接实现,因为thread_name是变量,不能与字符串字面量直接拼接(仅字符串字面量之间支持这种拼接语法)。上述方案是最贴合需求的可行实现方式。
内容的提问来源于stack exchange,提问作者kaytu
相关产品推荐
相关产品推荐

