宏用作字符串导致字符数组的初始化字符串太长

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};