参考文章:https://blog.csdn.net/u013073067/article/details/125356313
##__VA_ARGS__前面加上##的作用是:当可变参数的个数为0时,这里的##可以把把前面多余的","去掉,否则会编译出错。
在linux内核中随处可见这种宏定义的用法
#include <stdio.h>
#define LOG3(fmt, ...) printf("<%s:%s>:"fmt"\r\n", __FILE__, __FUNCTION__, ##__VA_ARGS__)
int main(int argc, char** argv)
{
char *str = "test __VA_ARGS__";
int num = 10086;
LOG3("this is test __VA_ARGS__");
LOG3("this is test __VA_ARGS__:%s, %d", str, num);
LOG3();
return 0;
}