1.作用
调试过程用到自定义的打印,可以用到##__VA_ARGS__
2.__VA_ARGS__用法
自定义打印用到的可变参数,使用...即可表示可变参数
#define LOG(...) printf(__VA_ARGS__)
//...表示可变参数,通过宏替换,将__VA_ARGS__替换成...
例子:
#include <stdio.h>
#define LOG(...) printf(__VA_ARGS__)
int main()
{
char *str = "test";
int num = 1;
LOG("this is test \r\n");
LOG("this is %s :%d\r\n", str, num);
return 0;
}
运行结果:
this is test
this is test :1
3.##__VA_ARGS__用法
加上##作用:当可变参数的个数为0时,##可以把前面多余的”,“去掉,否则编译出错。
#define tim_log(fmt, ...) _tim_log( __FILE__, __LINE__, fmt, ##__VA_ARGS__, 0)
#include <stdio.h>
#include <time.h>
//"<%s:%d>:----" 打印信息的前缀
//fmt 替换成 fmt
//"\n" 换行
//__VA_ARGS__ 替换成 ...
// ## 去掉前面多余的','
#define LOG(fmt, ...) printf("<%s:%d>:"fmt"\n", __FILE__, __LINE__,##__VA_ARGS__)
//...表示可变参数,__VA_ARGS__就是将...的值复制到这里
int main()
{
char *str = "test";
int num = 1;
LOG("this is test __VA_ARGS__\r\n");
LOG("this is %s __VA_ARGS__:%d\r\n", str, num);
LOG("*******************");
return 0;
}
执行结果:
<D:\Program Files\Notepad++\project\##__VA_ARGS__.c:11>:this is test __VA_ARGS__
<D:\Program Files\Notepad++\project\##__VA_ARGS__.c:12>:this is test __VA_ARGS__:1
<D:\Program Files\Notepad++\project\##__VA_ARGS__.c:13>:*******************
可见 __FILE__, __LINE__, 会被去掉,只剩下 printf("<%s:%d>:"fmt"\n", ##__VA_ARGS__)
4、gcc 复杂宏##args用法
#define debug(format, args…) printf(format, ##args)
#的作用 : 连接两个宏,如果可变参数被忽略或为空,"##"操作将使预处理器(preprocessor)去除掉它前面的那个逗号,编译不会报错。
本文中涉及的##__VA_ARGS__与##args在代码中常见的写法:
#define print_LOG(level, fmt, ...) printf("[%s][%d]"fmt"\n", __FUNCTION__, __LINE__, ##__VA_ARGS__)
#define print_LOG(level, fmt, args...) SYS_LOG("[WIFI]", level, fmt, ##args)