C++中可变参数宏

可变参数宏(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);
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值