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
相关产品推荐
相关产品推荐

