【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
#include
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

你可能感兴趣的:(c++,c++)