我正在编写一个简单的库来为终端的文本着色,但也许我做错了。
颜色.h:
extern enum col;
extern char* colors[8];
extern char* bold_colors[8];
void printColor(char* color, char* str);
颜色.c:
#include <stdio.h>
#include <string.h>
#include <colors.h>
enum col {
BLACK, RED, GREEN, BLUE, YELLOW, PURPLE, CYAN, WHITE, MAX_VALUE
};
char* colors[8] = {
[BLACK] = "\033[0;30m",
[RED] = "\033[0;31m",
[GREEN] = "\033[0;32m",
[YELLOW] = "\033[0;33m",
[BLUE] = "\033[0;34m",
[PURPLE] = "\033[0;35m",
[CYAN] = "\033[0;36m",
[WHITE] = "\033[0;37m"
};
char* bold_colors[8] = {
[BLACK] = "\033[1;30m",
[RED] = "\033[1;31m",
[GREEN] = "\033[1;32m",
[YELLOW] = "\033[1;33m",
[BLUE] = "\033[1;34m",
[PURPLE] = "\033[1;35m",
[CYAN] = "\033[1;36m",
[WHITE] = "\033[1;37m"
};
void printColor(char* color, char* str) {
printf("\033[0;37m");
printf(color);
printf(str);
printf("\033[0;37m");
}
main.c
#include "colors.h"
printColor(colors[GREEN], "text");
错误:
identifier "GREEN" is undefinedC/C++(20)
它应该在文件(多个)之间共享颜色数组,但返回错误。
您可能希望将枚举移至头文件并将其包含在 color.c 和 main.c 中
– 艾伦·温德
我同意这一点。
C 语言编程包括编译和链接。
在编译阶段,h文件中的声明对c文件有效,但c文件之间互不影响。你的问题就发生在这里。您可以通过在 h 文件中包含所有使用的声明来修复它。
在链接阶段,编译后的c文件被链接在一起。您的
extern
声明在此生效。然而,它们在编译阶段也是需要的,所以将它们放在 h 文件中是正确的。