我正在开发一个 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
这里不是一个坏习惯吗?
这种方法的问题是你有一个隐藏的
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
替换都是相同的。