函数可变参数深入分析之va_list、va_start、va_arg、va_end

/*time:2014.7.28

  author:Mr.liu  */

以前用到过这四个函数,但是不总结,就忘记了。下面一起来回顾这四个解析可变参的函数。


引:在应用函数的过程中通常会遇见函数参数不确定的情况,如何在参数不确定的情况下,仍旧写出一个通用模板的功能函数。

这就涉及到了对函数可变参数的解析。这样即使增加了参数的个数,解析参数的该功能模块依旧可以使用。

下面来介绍va_list、va_start、va_arg、va_end。

再看看各个宏的功能是什么?
  • va_list用于声明一个变量,我们知道函数的可变参数列表其实就是一个字符串,所以va_list才被声明为字符型指针,这个类型用于声明一个指向参数列表的字符型指针变量,例如:va_list ap;//ap:arguement pointer
  • va_start(ap,v),它的第一个参数是指向可变参数字符串的变量,第二个参数是可变参数函数的第一个参数,通常用于指定可变参数列表中参数的个数。
  • va_arg(ap,t),它的第一个参数指向可变参数字符串的变量,第二个参数是可变参数的类型。
  • va_end(ap) 用于将存放可变参数字符串的变量清空(赋值为NULL).

 #include <stdio.h>
 #include <stdarg.h>
 #include <stdlib.h>  
//第一个参数指定了参数的个数
{
 
  va_list vaptr;
  int i;
  int sum = 0;
  va_start(vaptr,number);
  for(i=0; i<number;i++)
  {
     sum += va_arg(vaptr,int);
  }
  va_end(vaptr);
  return sum;
}
  
int main()
 {
     printf("%d\n",sum(4,4,3,2,1));
     system("pause");
      return 0;
}
#endif

实现多参函数的函数相加功能。
 

va_arg返回可变的参数,va_arg的第二个参数是你要返回的参数的类型(如果函数有多个可变参数的,依次调用va_arg获取各个参数。这里不用具体去深究怎么实现依次去下一个值得。

我们看这个宏,首先是ap = ap + __INTSIZEOF(t)。注意到,此时ap已经被改变了,它已经指向了下一个参数,我们令x=ap + __INTSIZEOF(t);
那么括号内就变成了(x – __INTSIZEOF(t)),但是这里没有赋值运算符所以ap的值没有发生变化,此时ap仍然指向的是当前参数的下一个参数的位置,
也就是说ap指向的位置比当前正在处理的位置超前了一个位置。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值