变长参数的用法

https://blog.csdn.net/wenbodong/article/details/118468812

上面这个网址其中涉及到了变长参数的用法,非常的通俗易懂

#define LOG_D(fmt, ...) logger_output(LOG_LEVEL_DEBUG, LOG_TAG, __LINE__, fmt, ##__VA_ARGS__)
  • …用于接收变长参数,编译器做宏替换时,会将…接收的参数集替换到__VA_ARGS__所在位置。
  • ##为标识连接符,这里是用于处理变长参数集为空的场景。此时,##会吞噬前面的逗号。
LOG_D("this is a debug log");
LOG_D("rssi:%d", 30);

LOG_D("rssi:%d", 30)中的"rssi:%d"是格式化字符串,对应于LOG_D(fmt, ...)中的fmt参数,30则属于变长参数。为了便于理解,笔者给出中间替换结果,即LOG_LEVEL_DEBUG之类的不替换:

logger_output(LOG_LEVEL_DEBUG, LOG_TAG, __LINE__, "rssi:%d", 30);

至于LOG_D("this is a debug log"),如果没有##的话,将被替换为:

logger_output(LOG_LEVEL_DEBUG, LOG_TAG, __LINE__, "this is a debug log", );

有没有注意最右边有一个单独的逗号?##的作用就是在这种情况下把逗号给吃掉。

void logger_output(int level, const char *tag, int line_num, const char *fmt, ...)
{
   *************
   *************
}

 

上面的网址还是可以看看的

 

posted @ 2022-03-22 16:03  kingzhan  阅读(33)  评论(0编辑  收藏  举报