电脑桌面
添加小米粒文库到电脑桌面
安装后可以在桌面快捷访问

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

如何实现参数个数可变的函数_第1页
1/13
如何实现参数个数可变的函数_第2页
2/13
如何实现参数个数可变的函数_第3页
3/13
如何实现参数个数可变的函数 参数个数不定的函数,最频繁使用的就是printf()与scanf()。其实,我们也可以自己实现这样的功能,首先看一个例子: #include #include int Sum(int first, int second, ...) { int sum = 0, t = first; va_list vl; va_start(vl, first); while (t != -1) { sum += t; t = va_arg(vl, int);//将当前参数转换为 int类型 } va_end(vl); return sum; } int main(int argc, char* argv[]) { printf("The sum is %d\n", Sum(30, 20, 10, -1));//-1是参数结束标志 return 0; } 在上面的例子中,实现了一个参数个数不定的求 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, first)),因为所有参数都是连续存放的,通过移动指针就可以访问到每一个参数了(va_arg(vl, int)),这就是我在程序中使用到那几个宏的实现思想。 明白了以上原理之后,就可以完全不使用宏,自己实现这样的一个功能了,下面的程序是我按照上面的思想改写的: #include int Sum(int first, int second, ...) { int sum = 0, t = first; char * vl;//定义一个指针 vl = (char *)&first;//使指针指向第一个参数 while (*vl != -1)//-1是预先给定的结束符 { sum += *(int *)vl;//类型转换 vl += sizeof(int);//移动指针,使指针指向下一个参数 } return sum; } int main(int argc,...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。
3、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。

碎片内容

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

确认删除?
VIP
微信客服
  • 扫码咨询
会员Q群
  • 会员专属群点击这里加入QQ群
客服邮箱
回到顶部