*C变参函数示例,这个程序好像是以前摘自"K&R"

#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

相关文章: