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

我们一般写的函数都是参数个数固定的,有时候用起来不是很方便。
我们应该都用过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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值