stdarg.h头文件为函数提供了函数可以接受可变数量的参数。必须按照下面步骤: 1、提供一个使用省略号的函数原型; 2、在函数定义中创建一个va_list类型的变量; 3、用宏把该变量初始化为一个参数列表; 4、用宏访问参数列表; 5、用宏完成清理工作。 例如:
void func2(int n, ...);
void func2(const char * s, int k , ...);
省略号的前一个参数起着特殊的作用,标准用parmN这个术语来描述该形参。传递给该形参的实际参数是省略号部分代表的参数数量。 声明在stdarg.h中的va_list类型代表一种用于储存形参对应的形参列表中省略号部分的数据对象。 定义在stdarg.h中的va_start(),把参数列表拷贝到va_list类型的变量中。该宏有俩个参数:va_list类型的变量和parmN形参。 使用宏va_arg()访问参数列表的内容。该宏接收俩个参数:一个va_list类型的变量和衣蛾类型名。第一次调用va_arg(),它返回参数列表的第一项;第二次调用va_arg(),它返回参数列表的第二项;以此类推。表示类型的参数指定了返回值的类型。 使用va_end()宏完成清理工作。例如释放动态分配用于储存参数的内存。该宏接收一个va_list类型的变量。 调用va_end()(ap)后,只有用va_start重新初始化ap后,才能使用ap。 因为va_arg()不提供退回之前参数的方法,所有有必要保存va_list类型变量的副本。C99新增了一个宏va_copy()用于处理这种情况。该宏接收俩个va_list类型的变量作为参数,它把第二个参数拷贝给第一个参数。
double sum(int lim , ...)
{
int tic;
va_list ap;
va_list at;
va_copy(at, ap)
va_staart(ap, lim);
tic = va_arg(ap, double);
double toc = va_arg(ap, double);
va_end(ap);
}
#include <stdlib.h>
#include <stdarg.h>
double sum(int lim, ...);
int main()
{
double s = 0.0;
double t = 0.0;
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("sum(3, 1.1, 2.5, 13.3)=[%lf]\n", s);
printf("sum(6, 1.1, 2.1, 13.1, 4.1, 5.1, 6.1)=[%lf]\n", s);
return 0;
}
double sum(int lim, ...)
{
va_list ap;
va_list at;
va_copy(at, ap);
double tot = 0;
int i = 0;
va_start(ap, lim);
for(i = 0; i < lim; i ++)
{
tot += va_arg(ap, double);
}
va_end(ap);
return tot;
}
|