我不懂C巨集

时间:2018-08-19 21:00:17

标签: c macros

LOG_FORMATesp_log_write中如何扩展? format LOG_RESET_COLORLOG_FORMAT中做什么?

 #define LOG_FORMAT(letter, format)  LOG_COLOR_ ## letter #letter " (%d) %s: " format LOG_RESET_COLOR "\n"

 esp_log_write(ESP_LOG_VERBOSE, tag, LOG_FORMAT(V, format), esp_log_timestamp(), tag, ##__VA_ARGS__); }


void esp_log_write(esp_log_level_t level,
                   const char *tag,
                   const char *format, ...)
{
    va_list arg;
    va_start(arg, format);
    vprintf(format, arg);
    va_end(arg);
}

1 个答案:

答案 0 :(得分:1)

在宏扩展中,##表示任何带有宏参数的文本的连接。 #表示其后的宏参数将放在双引号中。

现在,在'C'相邻字符串文字中,仅由空格分隔确实意味着2个字符串的串联,即"hello " "world"的确意味着"hello world"

因此,宏LOG_FORMAT(V, format)被扩展为

LOG_COLOR_V "V" " (%d) %s: " format LOG_RESET_COLOR "\n" 

现在,以上内容本身不是合法的“ C”语法。因此,很可能还有LOG_COLOR_VformatLOG_RESET_COLOR的定义。应该将它们本身定义为带引号的字符串。在这种情况下,以上所有内容都将解释为单引号字符串。