我有一组函数都像这样构建一个日志字符串:
...
// 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 调用保持在最低限度。唯一的缺点是声明了很多本地缓冲区,但我觉得在我的情况下这是可以管理的。非常感谢所有反馈。
最佳答案
只要您意识到它使函数不可重入,返回指向静态的指针就可以了。所以,例如,
snprintf(buffer, BUFSIZ, "%s %s", dump_1(obj1), dump_1(obj2));
会失败,因为对 dump_1() 的两次调用会干扰,并且可能不会按照您期望的顺序调用。此外,您将无法在线程代码中使用这些函数。通用字符串函数的最佳做法是将输出字符串和大小作为参数传递,就像 snprintf 一样。
关于c - 在C中返回一个 "static char[]"的字符串好不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20851012/