可变参数宏
可变参数宏(Macro With Variable Number of Arguments or Variadic Macro) 是指我们可以像定义能够接受不同数量参数的普通C++函数一样,定义一个能够接受不同数量参数宏。
基本语法
#define DEBUG(format, ...) fprintf (stderr, format, __VA_ARGS__)
#define DEBUG(format, args...) fprintf (stderr, format, args)
#define DEBUG(format, args...) fprintf (stderr, format, ##args)
#define DEBUG(format, ...) fprintf (stderr, format, ##__VA_ARGS__)
- __VA_ARGS__替代的是宏函数中最后一个具名变量后的所有内容,其本身是编译器预定义的宏
- args为C++支持的可变参数的别名
- 如果args或者__VA_ARGS__为空时,##会去掉args或者__VA_ARGS__前面多余的逗号,防止编译错误。
实现格式化打印字符串
使用可变参数宏实现格式化打印字符串往往需要用到vsnprint(),函数定义如下:
int vsnprintf( char* buffer, size_t buf_size, const char* fmt, va_list vlist );
vsnprintf() 函数将格式化字符串fmt 指向的字符串写入字符串缓冲区buffer,可写入的最大字符数为 buf_size ,写入字符后,添加终止空字符;如果buf_size 等于零,则不写入任何内容并且buffer 可能是空指针。
除此之外,格式化字符串fmt可能包含以 % 开头的占位符,这些占位符被作为列vlist 传递的变量的值替换。
va_list
va_list类型的变量保存了可变参数的各种信息,用法如下:
va_list args;
创建一个va_list类型的变量args,此时 args 还未初始化,类似一个空指针,接下来我们要把这个‘’空指针‘’ 指定到我们需要的位置上,比如指到fmt后。
va_start(args, fmt);
调用 va_start() ,args指向了fmt之后的参数,接下来就可以用args访问这些参数了。
//每次返回一个int ( 根据实际情况确定类型) 参数并把位置往前推1,一般从前往后循环调用。
var_arg(args,int);
访问完毕后,把args置空。
va_end(args);