如何实现参数个数可变的函数

如何实现参数个数可变的函数

ID:13385644

大小:37.50 KB

页数:13页

时间:2018-07-22

如何实现参数个数可变的函数_第1页
如何实现参数个数可变的函数_第2页
如何实现参数个数可变的函数_第3页
如何实现参数个数可变的函数_第4页
如何实现参数个数可变的函数_第5页
资源描述:

《如何实现参数个数可变的函数》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、如何实现参数个数可变的函数参数个数不定的函数,最频繁使用的就是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);//

2、将当前参数转换为int类型     }     va_end(vl);     returnsum;}intmain(intargc,char*argv[]){     printf("Thesumis%d",Sum(30,20,10,-1));//-1是参数结束标志     return0;}在上面的例子中,实现了一个参数个数不定的求int型和的函数Sum()。函数中一开始定义了一个va_list型变量vl,该变量用来访问可变参数,实际上就是指针,接着使用va_start使vl指向第一个参数,然后再使用va_arg来遍历每一个参数,va

3、_arg返回参数列表中的当前参数并使vl指向参数列表中的下一个参数。最后通过va_end把vl指针清为NULL。在这里,va_start,va_arg,va_end其实都是宏,那么这些宏又是如何实现他们的功能的呢?一个很显然的问题就是既然参数个数在函数调用之前没有确定,所以,在函数定义的时候没有办法像普通函数那样使用确定的变量来接受传进来的参数,于是,问题的关键就是如何接收到这些不确定的参数了?首先,看看函数调用时实际发生的情况,在函数调用的时候,使用栈传递参数,拿上例来说,如果调用Sum(30,20,10,-1),那么参数入栈后的情形如下图

4、所示(假定按照自右至左的顺序入栈):既然参数在栈中的情形已经知道了,那么,如果使用指针(程序中的vl)指向第一个参数(va_start(vl,first)),因为所有参数都是连续存放的,通过移动指针就可以访问到每一个参数了(va_arg(vl,int)),这就是我在程序中使用到那几个宏的实现思想。      明白了以上原理之后,就可以完全不使用宏,自己实现这样的一个功能了,下面的程序是我按照上面的思想改写的:#includeintSum(intfirst,intsecond,...){intsum=0,t=first;cha

5、r*vl;//定义一个指针vl=(char*)&first;//使指针指向第一个参数while(*vl!=-1)//-1是预先给定的结束符{       sum+=*(int*)vl;//类型转换       vl+=sizeof(int);//移动指针,使指针指向下一个参数}returnsum;}intmain(intargc,char*argv[]){printf("Thesumis%d",Sum(30,20,10,-1));//-1是参数结束标志return0;}可以看出,通过使用指针的确实现了参数个数不定的函数了,但是程序中还有一

6、个问题,那就是移动指针,在程序中因为我使用的参数都是相同的int类型,所以可以事先知道访问下一个参数的时候应该移动sizeof(int)个字节,但是,如果参数的类型不同呢?这的确是个比较麻烦的问题,因为不同的数据类型占用的字节数可能是不一样的(如double型为8个字符,shortint型为2个),所以很难事先确定应该移动多少个字节!但是办法还是有的,这就是使用指针了,无论什么类型的指针,都是占用4个字节,所以,可以把所有的传人参数都设置为指针,这样一来,就可以通过移动固定的4个字节来实现遍历可变参数的目的了,至于如果取得指针中的内容并使用他

7、们,当然也是无法预先得知的了,所以这大概也就是像printf(),scanf()之类的函数还需要一个格式控制符的原因吧^_^!不过实现起来还是有不少麻烦,暂且盗用vprintf()来实现一个与printf()函数一样功能的函数了,代码如下:voidmyPrint(constchar*frm,...){   va_listvl;   va_start(vl,frm);   vprintf(frm,vl);   va_end(vl);}如何用C实现参数个数可变的函数采用C语言编程的时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参

8、数对应的所有实际参数。但在某些情况下希望函数的参数个数可以根据需要确定。典型的例子有大家熟悉的函数printf()、scanf()和系统调用execl()等。那么它

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。