如何实现参数个数可变的函数参数个数不定的函数,最频繁使用的就是printf()与scanf()
其实,我们也可以自己实现这样的功能,首先看一个例子:#include#includeintSum(intfirst,intsecond,
){intsum=0,t=first;va_listvl;va_start(vl,first);while(t
=-1){sum+=t;t=va_arg(vl,int);//将当前参数转换为int类型}va_end(vl);returnsum;}intmain(intargc,char*argv[]){printf("Thesumis%d\n",Sum(30,20,10,-1));//-1是参数结束标志return0;}在上面的例子中,实现了一个参数个数不定的求int型和的函数Sum()
函数中一开始定义了一个va_list型变量vl,该变量用来访问可变参数,实际上就是指针,接着使用va_start使vl指向第一个参数,然后再使用va_arg来遍历每一个参数,va_arg返回参数列表中的当前参数并使vl指向参数列表中的下一个参数
最后通过va_end把vl指针清为NULL
在这里,va_start,va_arg,va_end其实都是宏,那么这些宏又是如何实现他们的功能的呢
一个很显然的问题就是既然参数个数在函数调用之前没有确定,所以,在函数定义的时候没有办法像普通函数那样使用确定的变量来接受传进来的参数,于是,问题的关键就是如何接收到这些不确定的参数了
首先,看看函数调用时实际发生的情况,在函数调用的时候,使用栈传递参数,拿上例来说,如果调用Sum(30,20,10,-1),那么参数入栈后的情形如下图所示(假定按照自右至左的顺序入栈):既然参数在栈中的情形已经知道了,那么,如果使用指针(程序中的vl)指向第一个参数(va_start(vl,