繁体   English   中英

我不懂 C 宏

[英]I don't understand C macros

如何在LOG_FORMAT在扩大esp_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);
}

在宏扩展中##表示将任何文本与宏参数连接起来。 #表示它后面的宏参数将放在双引号中。

现在,在 '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 它们应该被定义为带引号的字符串本身。 在这种情况下,以上所有内容都将被解释为单引号字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM