/*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指向的位置比当前正在处理的位置超前了一个位置。