宏va_arg()、va_start()和va_end()一起使用,便可以完成向函数传入数目可变的变元操作。取可变数目变元的典型例子是函数printf()。
类型va_list是在中定义的,上述的宏原型如下所示:
type va_arg(va_list argptr, type);
void va_end(va_list argptr);
void va_start(va_list argptr, last_parm);
它们都包含在头文件中。
创建一个能获取可变数目变元的函数的通用过程:在函数定义中,可变参数表之前必须有一个或多个已知参数,其中最右者为last_parm。在调用va_start()时,last_parm名被用作第二个参数。
使用任何可变长度的变元被访问之前,必须先用a_start()初始化变元指针argptr。初始化argptr后,经过对va_arg()的调用,以作为下一个参数类型的参数类型,返回参数。最后取完所有参数并从函数返回之前。必须调用a_end(),由此确保堆栈的正确恢复,如果未正确使用va_end(),程序可能瘫痪。
例子:
用sum_series()求一系列的总和,sum_series()的第一个变元是数列项目数。本程序是求以下数列的前四项之和:
1/2+1/(2*2)+1/(2*2*2)...............
#include
#include
double sum_series(int num, ...);
int main()
{
double d;
d= sum_series(4, 0.5, 0.25, 0.125, 0.06254);
printf("Sum of series is %f.\n", d);
return 0;
}
double sum_series(int num, ...)
{
double sum= 0.0, t;
va_list argptr;
va_start(argptr, num);
for(; num; num--)
{
t= va_arg(argptr, double);
sum= sum+ t;
}
va_end(argptr);
return sum;
}
阅读(1251) | 评论(0) | 转发(0) |