变元个数可变的函数

比如

double average(double value1,double value2, ...)//函数的变元数是可变的
{

}

要使用这种函数,必须同时使用三个宏:va_start(),va_arg(),va_end(),都被包含在<stdarg.h>里,
初始化这个函数需要使用void va_start(va_list parg,last_fixed_arg);//此函数接受两个变元,va_list类型指针parg和为函数指定最后一个固定参数的名字。

double average(double v1,double v2, ...)
{
va_list parg;//va_list在stdrag中定义,用于存储支持可变参数列表的信息
va_start(parg,v2);
}

首先声明一个va_list parg的类型的变量parg,parg作为第一个变元,指定最后一个固定参数v2作为第二个变元。

double average(double v1,double v2, ...)//扩展后的函数
{
va_list parg;//va_list在stdrag中定义,用于存储支持可变参数列表的信息
va_start(parg,v2);
double sum = v1 + v2;
double value = 0;
int count = 2;

  while((value = va_arg(parg,double)) != 0.0)
  {

  sum +=value;
  count++;
}
va_end(parg);
return sum/count;
}

while循环里调用了<stdarg.h>头文件中的另一个函数va_arg().va_arg()的第一个变元是通过调用va_start()初始化的变量parg,第二个变元是期望确定的变元类型的说明。va_arg()函数会返回parg指定的当前变元值,并将他储存在value中,同时更新parg指针,使之根据之前调用中的指定类型,指向列表的下一个变元。

调用va_end()函数。处理该过程的剩余工作,它会将parg重置为指向NULL,如果省掉这个调用,程序就不会正常工作。

复制va_list

有时候需要多次处理可变的变元列表<stdarg.h>头文件,定义了一个复制已有的va_list的例程,假定已经使用va_start()创建并初始化了一个va_list对象parg,现在要复制parg:
va_list parg_copy;
copy(parg_copy,parg);

使用长度可变化的变元列表的基本规则

1.至少有一个固定变元

2.必须调用va_list()初始化函数中科变变元列表指针的值,边远指针类型必须声明为va_list()

3.必须确定每个变元类型的机制

4.必须有何时终止变元列表的方法。

5.va_arg()的第二个变元指定了变元值的类型,

6.最后必须调用va_end

posted on 2020-08-25 20:07  EasternCabbage  阅读(344)  评论(0)    收藏  举报

导航