You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 22:39:25