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

C语言宏定义拼接字符串字面量指针,#操作符字符串化问题如何解决

问题原因

#是C语言的预处理运算符,仅在编译期生效,作用是将传入宏的参数字面量直接转换为字符串常量,不会读取运行时变量存储的实际内容。你当前代码中FUN(name)在预处理阶段就会被直接替换为"[name] "固定字符串,因此输出前缀固定为[name],无法拿到name指针指向的函数名字符串。

修复方案

去掉使用#运算符的字符串化宏,直接在格式化输出时拼接name变量的实际值即可。同时建议替换无边界的字符串操作函数为带长度校验的版本,避免缓冲区溢出风险,修改后的完整代码如下:

#include <stdio.h>
#include <stdarg.h>

void foo(const char *name, char *fmt, ...)
{
    char buff[100] = {0};
    va_list pList;
    
    va_start(pList, fmt);
    int ret = vsnprintf(buff, sizeof(buff), fmt, pList);
    va_end(pList);
    
    char p[100] = {0};
    // 直接格式化拼接name变量的实际值
    snprintf(p, sizeof(p), "[%s] %s", name, buff);
    printf("%s\n", p);
}

void bar()
{
    foo(__func__, "Some string with value = %d", 5);
}

int main() 
{
    bar();
    return 0;
}

运行后输出结果为:

[bar] Some string with value = 5

如果需要保留宏定义写法,可以将宏改为格式化字符串形式:

// 宏定义前缀格式
#define LOG_PREFIX "[%s] "
// 拼接时使用
snprintf(p, sizeof(p), LOG_PREFIX "%s", name, buff);

内容的提问来源于stack exchange,提问作者xyf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 13:36:02