C++可变参数宏

0、如下为一个小例子

#define F(...) printf(__VA_ARGS__)  	  
F("hello\n");          
F("count = %d\n", ONE);  

1、一个更加丰富的栗子:

//此处仅作示例,参数数量略少
#define LOG(...) Log(#__VA_ARGS__,__VA_ARGS__)  
//实现部分
//参数str接收的是__VA_ARGS__可变参数拼接成的字符串
void Log(std::string str,...){
	//定义要存放可变参数的列表 ap
	va_list ap;
	//初始化可变参数列表的存储地址(可讨论)
	va_start(ap, str);
	//初次开辟空间大小
    int nLen = MAX_LINE_LENGTH;
    char *buf = (char *)malloc(nLen);
    //接收可变参数中的第一个参数,这里,我们假定是一个字符类型的
    //(需要事先知道类型,否则按照字符接收,可能出现显示异常)
    //这里我们接收的第一个参数是一个流格式fmt,形如%s%d%c
    const char * fmt = va_arg(ap, const char*);
    int nSize = 0;
    //使用vsnprintf可以很好的避免buf空间不足,出现内存溢出
    //按照第一个参数规定的格式,将后续所有的参数一次性接受到buf中
    //ps:如果不想这样接收,大可以使用接收第一个参数时的方式(va_arg),接收剩下的参数,
    //需要注意的是,必须知道所有参数的类型,和总的参数个数(这时,
    //大家一般选择用第一个参数表示后续的参数个数,再使用一个循环,按照事先约定的数据类型依次接收剩下的数据)
    while(nSize = vsnprintf(buf, nLen, fmt, ap) < 0)
	{
		 nLen*=2;
		 //当nSize<0代表空间不足,我们重新为buf开辟一个更大的空间。
		 buf = (char *)realloc(buf, nLen);
	 }
	str = buf;
}

参考:
百度百科-vsnprintf

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值