在C中返回"static char []"字符串是否合适?

c00*_*ter 1 c string

我有一组函数都构建一个这样的日志字符串:

...
// 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;
}
Run Code Online (Sandbox Code Playgroud)

这是一个很好的方法吗,还是有更好的方法来实现同样的事情?我可以使用动态分配的字符串,但后来我必须添加内存管理,这将使代码更复杂.我也可以传递缓冲区,然后直接写入缓冲区,但这意味着很多额外的snprintf调用,因为每次我想在字符串中添加内容时都必须调用snprintf.

编辑:在我的情况下,线程安全不是问题,并且日志记录调用不是可重入的.所以从理论上讲,我可以保持原样.然而,根据mcleod_ideafix的建议,以某种方式感觉更干净.这样我就不需要任何静态变量了,我仍然会将snprintf调用保持在最低限度.唯一的缺点是声明了很多本地缓冲区,但我觉得这在我的情况下是可控的.非常感谢所有的反馈.

Lee*_*ker 6

只要您意识到它使函数不可重入,返回指向静态的指针就可以了.所以,例如,

snprintf(buffer, BUFSIZ, "%s %s", dump_1(obj1), dump_1(obj2));
Run Code Online (Sandbox Code Playgroud)

将失败,因为对dump_1()的两次调用将发生干扰,并且可能无法按照您期望的顺序调用.此外,您将无法使用线程代码中的函数.通用字符串函数的最佳实践是将输出字符串和大小作为参数传递,就像snprintf一样.