【问题标题】:Macro uses as string cause initializer-string for array of chars is too long宏用作字符串导致字符数组的初始化字符串太长
【发布时间】: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 个用于空终止符)。

标签: c arrays macros


【解决方案1】:

您的字符串大小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};

【讨论】:

    猜你喜欢
    • 2010-12-14
    • 2014-10-16
    • 2014-02-19
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    相关资源
    最近更新 更多