*C变参函数示例,这个程序好像是以前摘自"K&R" varargs.c#include <stdio.h>#include <stdarg.h>double sum(int,...); int mai...
*C变参函数示例,这个程序好像是以前摘自"K&R"
varargs.c#include <stdio.h>
#include <stdarg.h>
double sum(int,...);
int main(void){
double s,t;
s = sum(3,1.1,2.5,13.3);
t = sum(6,1.1,2.1,13.1,4.1,5.1,6.1);
printf("return value for "
"sum(3,1.1,2.5,13.3): %g\n",s);
printf("return value for "
"sum(6,1.1,2.1,13.1,4.1,5.1,6.1): %g\n",t);
return 0;
}
/*求数值和,第一个参数表示后续数列个数*/
double sum(int lim,...){
va_list ap;
double tot = 0;
int i;
va_start(ap,lim); //根据最后一个固定参数,初始化可变参数指针ap的地址位置
for(i=0;i<lim;i++)
tot += va_arg(ap,double); //依次返回参数值
va_end(ap); //注销指针ap
return tot;
}
*使用步骤
1)包含<stdarg.h>,声明变参函数(至少一个固定参数,变参使用”…”)
2)声明指向变参的指针va_list
3)va_start(va_list,最后一个固定参数)宏初始化va_list,指向第一个可变参数地址
4)va_arg(va_list,参数类型),每次调用返回当前地址,并把va_list指向下个变参地址
5)var_end(va_list),注销va_list
*总结
---注意的地方
1)在于va_arg(),要保证取到正确的参数,适时返回,不能地址越界.
---实现原理简单说,根据宏+函数栈的内存结构确定获取变参地址.
*参考
http://www.ibm.com/developerworks/cn/linux/l-va/index.html