【Unix环境高级编程】编写变长参数函数
文件的格式输入输出函数都支持变长参数。定义时,变长参数列表通过省略号'...'表示, 因此函数定义格式为:
type 函数名(parm1, parm2,parmN,...);
Unix的变长参数通过va_list对象实现,定义在文件'stdarg.h'中,变长参数的应用模板如下所示:
#include <stdarg.h> function(parmN,...){ va_list pvar; ................................. va_start(pvar,parmN); while() { .................. f = va_arg(pvar,type); ................... } va_end(pvar); }
va_list数据类型变量pvar访问变长参数列表中的参数,宏va_start初始化变长参数列表,根据parmN判断参数列表的起始位置。va_arg获取变长列表中参数的值,type指示参数的类型,也使宏va_arg返回数值的类型。宏va_arg执行完毕后自动更新对象pvar将其指向下一个参数va_end关闭变长参数的访问。
下面这个实例mysum.c计算输入参数的和并返回:
1 //mysum.c 2 #include <stdarg.h> 3 #include <stdio.h> 4 int mysum(int i, ...){ 5 int r = 0,j = 0; 6 va_list pvar; 7 8 va_start(pvar,i); 9 for(j=0;j<i;j++){ 10 r += va_arg(pvar,int); 11 } 12 va_end(pvar); 13 return(r); 14 } 15 16 int main() 17 { 18 printf("sum(1,4) = %d\n",mysum(1,4)); 19 printf("sum(2,4,8) = %d\n",mysum(2,4,8)); 20 21 return 0; 22 }
运行结果如下: