我们一般写的函数都是参数个数固定的,有时候用起来不是很方便。
我们应该都用过printf()函数,他的原型如下:
int printf ( const char * format, ... );
printf是c语言中用来输出信息的,和c++中的cout差不多。但是他可以输入任意参数。
他是怎么实现的呢?有没有想使自己的函数也可以是任意个参数呢?
下来我就来带领大家来实现。
首先来一段代码,他实现了任意个数字相加。
#include <iostream>
#include <stdarg.h>
using std::cin;
using std::cout;
using std::endl;
void Sum(int number,...)
{
va_list vl;
va_start(vl,number);
double sum=0;
for (int i=0;i<number;i++)
{
sum+=va_arg(vl,double);
}
va_end(vl);
cout<<"总和:"<<sum<<endl;
}
int main()
{
Sum(3,3.4334,4.4554,32.22);
return 0;
}
可以输入任何个参数,是不是很神奇呀?
让我们来解剖这个程序。
我们包含一个头文件进来:
#include <stdarg.h>
1 这里面存放这我们实现无参函数的关键宏和类型:
va_start、va_arg、va_list、va_end....
2 接下来看函数原型:
void Sum(int number,...);
我们可以用三个点...来代替要我们要输入的任意个参数.这里 的number是指我要传入的其他参数的个数.后面的循环将要用 到.
3 现在来讲解这些宏和类型.
va_list是一种类型,他用来存放传入的参数的一些信息.
va_start的宏的原型:
void va_start (va_list ap, paramN);
调用这个宏之后,va_list的变量就存有了传入参数的信息,
而paramN是指针位置的,传入的是一个参数的名字,而储存在va_list中的信息就是paramN后面的参数.
因此用va_list建立了一个vl变量后,就用va_start来把参数number后面的参数存在了vl中
4 va_arg的原型是:type va_arg (va_list ap, type)
这个函数的作用是用来提取存在va_list中的信息,type就是要返回的类型,这个依据自己传入的变量的类型而定.
所以我就用sum+=va_arg(vl,double);
5 之后va_end就很简单了.就是结束的意思,把va_list中变量的值设置为恰当的值.如果第二次使用va_list之前必须使用va_end.