【发布时间】:2020-06-23 21:07:02
【问题描述】:
我目前正在尝试制作一个 C 库,它可以让我在未来的项目中制作我想要的任何类型的日志。
为了做到这一点,我设置了一些东西,比如颜色、粗体......
#define RESET "\033[0m"
#define BOLD(msg) "\033[1m" msg RESET
#define BLINK(msg) "\033[5m" msg RESET
#define YELLOW(msg) "\033[38;5;208m" msg RESET
#define ORANGE(msg) "\033[38;5;208m" msg RESET
#define RED(msg) "\033[38;5;196m" msg RESET
#define BLUE(msg) "\033[38;5;27m" msg RESET
#define GREEN(msg) "\033[38;5;46m" msg RESET
#define PURPLE(msg) "\033[38;5;164m" msg RESET
#define NULL_STR ""
#define INFO_STR "[" BOLD(YELLOW("INFO")) "] "
#define WARN_STR "[" BOLD(ORANGE("WARNING")) "] "
#define ERROR_STR "[" BLINK(BOLD(RED("ERROR"))) "] "
#define DEBUG_STR "[" BOLD(BLUE("DEBUG")) "] "
#define UNKNOWN_TYPE_STR "[" BOLD(PURPLE("UNKNOWN TYPE")) "] "
为了在打印之前构建字符串,我设置了一个与枚举一起使用的字符串数组:
typedef enum log_type_e {
NONE = 0,
INFO = 1,
WARN = 2,
ERRO = 4,
DEBUG = 8
} log_type_t;
// I put both of my tries they lead to the same issue
static const char (*LOG_TYPE_STR)[] = {NULL_STR, INFO_STR, WARN_STR, UNKNOWN_TYPE_STR, ERROR_STR, UNKNOWN_TYPE_STR, UNKNOWN_TYPE_STR, UNKNOWN_TYPE_STR, DEBUG_STR};
//the 9 has to be set or it lead to an error
static const char LOG_TYPE_STR[][9] = {NULL_STR, INFO_STR, WARN_STR, UNKNOWN_TYPE_STR, ERROR_STR, UNKNOWN_TYPE_STR, UNKNOWN_TYPE_STR, UNKNOWN_TYPE_STR, DEBUG_STR};
当我编译一个使用 LOG_TYPE_STR 数组的程序时,我多次收到此警告:
initializer-string for array of chars is too long
16 | #define INFO_STR "[" BOLD(YELLOW("INFO")) "] "
如果有人可以帮助我理解修复它,或者如果有人知道我可以如何动态地构建我的字符串,我将非常感激。谢谢
【问题讨论】:
-
static const char LOG_TYPE_STR[][9]的定义只允许在以 nul 结尾的字符串中使用8字符,但您的宏正在构建更长的字符串。错误消息中的INFO_STR用作初始化程序,但即使YELLOW部分本身也太长了。 -
YELLOW将 15 个字符添加到字符串中。BOLD添加 8 个字符。所以BOLD(YELLOW("INFO"))的长度为 27 个字符(加上 1 个用于空终止符)。