【发布时间】:2013-12-31 02:51:46
【问题描述】:
我有一组函数都在构建这样的日志记录字符串:
...
// Top level snprintf call
snprintf(buffer, BUFSIZ, "%s %s %s", dump_1(obj), dump_2(obj), dump_3(obj));
...
static char *dump_1(my_own_type_t obj)
{
static char t1[BUFSIZ];
// Logic printing obj data into t1
return t1;
}
static char *dump_2(my_own_type_t obj)
{
static char t2[BUFSIZ];
// Logic printing obj data into t2
return t2;
}
static char *dump_3(my_own_type_t obj)
{
static char t3[BUFSIZ];
// Logic printing obj data into t3
return t3;
}
这是一种好方法,还是有更好的方法来实现同样的目标?我可以改用动态分配的字符串,但是我必须添加内存管理,这会使代码更加复杂。我也可以传递缓冲区,然后直接写入缓冲区,但这意味着需要大量额外的 snprintf 调用,因为每次我想向字符串添加内容时都必须调用 snprintf。
编辑: 在我的情况下,线程安全不是问题,并且日志调用不是可重入的。所以理论上我会很好地保持现状。但是,按照 mcleod_ideafix 的建议,以某种方式这样做感觉更干净。这样我就不需要任何静态变量,而且我仍然会将 snprintf 调用保持在最低限度。唯一的缺点是声明了很多本地缓冲区,但我觉得在我的情况下这是可以管理的。非常感谢所有反馈。
【问题讨论】:
-
这完全不是线程安全的,这对您的情况有影响吗?
-
如果您曾经运行多个线程,甚至只是进行可重入调用,这将严重失败。
-
@ChrisHayes:不,线程安全不是问题。