比如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
原文:https://www.cnblogs.com/easterncabbage/p/13552198.html