您的位置:首页 > 编程语言 > C语言/C++

c&c++函数变参的实现

2016-06-11 20:50 357 查看
我们一般写的函数都是参数个数固定的,有时候用起来不是很方便。
我们应该都用过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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: