宏用作字符串导致字符数组的初始化字符串太长
Macro uses as string cause initializer-string for array of chars is too long
我目前正在尝试制作一个 C 库,它可以让我在未来的项目中制作我想要的任何类型的日志。
为了做到这一点,我设置了一些东西,例如颜色、粗体...
#define RESET "3[0m"
#define BOLD(msg) "3[1m" msg RESET
#define BLINK(msg) "3[5m" msg RESET
#define YELLOW(msg) "3[38;5;208m" msg RESET
#define ORANGE(msg) "3[38;5;208m" msg RESET
#define RED(msg) "3[38;5;196m" msg RESET
#define BLUE(msg) "3[38;5;27m" msg RESET
#define GREEN(msg) "3[38;5;46m" msg RESET
#define PURPLE(msg) "3[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")) "] "
如果有人能帮助我理解修复它,或者如果有人知道我如何构建我的动态字符串,我将不胜感激。谢谢
您的字符串大小 9
不允许所有转义序列和其他包装字符的空间。 INFO_STR
需要30个字节,UNKNOWN_TYPE_STR
需要39个字节。
您应该能够使用指向字符串文字的指针数组来完成此操作。您只是语法有点错误。去掉括号。
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};
我目前正在尝试制作一个 C 库,它可以让我在未来的项目中制作我想要的任何类型的日志。
为了做到这一点,我设置了一些东西,例如颜色、粗体...
#define RESET "3[0m"
#define BOLD(msg) "3[1m" msg RESET
#define BLINK(msg) "3[5m" msg RESET
#define YELLOW(msg) "3[38;5;208m" msg RESET
#define ORANGE(msg) "3[38;5;208m" msg RESET
#define RED(msg) "3[38;5;196m" msg RESET
#define BLUE(msg) "3[38;5;27m" msg RESET
#define GREEN(msg) "3[38;5;46m" msg RESET
#define PURPLE(msg) "3[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")) "] "
如果有人能帮助我理解修复它,或者如果有人知道我如何构建我的动态字符串,我将不胜感激。谢谢
您的字符串大小 9
不允许所有转义序列和其他包装字符的空间。 INFO_STR
需要30个字节,UNKNOWN_TYPE_STR
需要39个字节。
您应该能够使用指向字符串文字的指针数组来完成此操作。您只是语法有点错误。去掉括号。
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};