从 C 函数中返回静态字符串是一种不好的做法吗?

问题描述 投票:0回答:1

我正在开发一个 C 程序,其中实现了一个生成 ANSI 颜色代码以打印彩色文本的函数。

const char* getAnsiColorCode(int colorId) {
    static char colorCode[15];
    snprintf(colorCode, sizeof(colorCode), "\e[38;5;%dm", colorId);
    return colorCode;
}

我的任务所需要做的就是打印一些彩色的hello worlds:

int main(int argc, char *argv[]) {
    for (int i = 0; i < 256; i++) {
        printf("%sHello, World!\n", getAnsiColorCode(i));
    }
}

这是我能找到的最干净的解决方案,但我想知道将

colorCode
声明为
static
是否不是一个不好的做法。
colorCode
的每次初始化都会覆盖同一个变量,还是之前的
colorCode
会保留在内存中?我真的不喜欢他们所有人都留在那里的想法。但如果
colorCode
被覆盖,看起来也不错。

我还尝试了一些其他解决方案,但我不太喜欢它们。 我不想在堆上分配

colorCode
然后释放它。 我也不想将其作为参数传递,因为这样看起来不太干净。 有没有比
static
更好的方法,并且
static
这里不是一个坏习惯吗?

c string static
1个回答
0
投票

这种方法的问题是你有一个隐藏的

static
状态,这使得你的函数既不可重入也不线程安全。

例如考虑以下代码:

int main(int argc, char *argv[]) {
    for (int i = 0; i < 256; i++) {
        printf("%sHello, World!%s\n", getAnsiColorCode(i), getAnsiColorCode(0));
    }
}

输出将是不确定的,因为

getAnsiColorCode
的调用顺序未指定,但在所有情况下,
printf
输出的 espace 序列对于两个
%s
替换都是相同的。

© www.soinside.com 2019 - 2024. All rights reserved.