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