【C++可变参数宏__VA_ARGS__】

C++可变参数宏__VA_ARGS__

  之前我们学习了C++中的可变参数,但是可变参数还是只能应用在真正的函数中,不能使用在宏中。而在C99编译器标准终于改变了这种局面,它允许你可以定义可变参数宏(variadic macros),这样你就可以使用拥有可以变化的参数表的宏。
  可变参数宏有如下几种定义:

#define DEBUG(format, ...) printf (format, __VA_ARGS__)
#define DEBUG(format, args...) printf (format, args)
#define DEBUG(format, args...) printf (format, ##args)
#define DEBUG(format, ...) printf (format, ##__VA_ARGS__)

其中,缺省号代表一个可以变化的参数表。使用保留名 VA_ARGS 把参数传递给宏。当宏的调用展开时,那些符号序列集合将代替里面的**VA_ARGS**标识符。例如:

DEBUG("X = %d\n", X);
处理器会把宏的调用替换成:
printf("X = %d\n", X);
因为DEBUG()是一个可变参数宏,你能在每一次调用中传递不同数目的参数

下面我们看一个简单案例:

#include<iostream>
#include<cstdarg>
using namespace std;

#define ADD(int_params,...) add(int_params,__VA_ARGS__,0)//_VA_ARGS__,这个宏可以取到变参

//求和函数
int add(int firstParam, ...)
{
	va_list arg_ptr;
	int sum = 0;
	int nArgValue;
	sum += firstParam;
	va_start(arg_ptr, firstParam);
	for (nArgValue = va_arg(arg_ptr, int); nArgValue != 0;)
	{
		sum = sum + nArgValue;
		nArgValue = va_arg(arg_ptr, int);
	}
	va_end(arg_ptr);
	return sum;
}

int main()
{
	cout << "add = " << add(1, 2, 3, 0) << endl;       //运行结果:6
	cout << "ADD = " << ADD(1, 2, 3, 4, 5) << endl;
	system("pause");
}

结果输出:
在这里插入图片描述
值得注意的是##VA_ARGS 宏前面加上 ## 的作用在于,当可变参数的个数为0时,这里的 ## 起到把前面多余的","去掉的作用,否则会编译出错。
参考:https://blog.csdn.net/u011622208/article/details/111698948
   http://t.zoukankan.com/touch-skyer-p-6378685.html

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值