可变参数
在C语言编程中有时会遇到一些参数可变的函数,例如printf()、scanf(),其函数原型为:
int printf(const char* format,…)
int scanf(const char *format,…)
对于printf ,它除了有一个参数 format 固定以外,后面的参数其个数和类型都是可变的,用三个点“…”作为参数占位符。 任何一个可变参数的函数都可以分为两部分:固定参数和可选参数。至少要有一个固定参数,其声明与普通函数参数声明相同;可选参数由于数目不定(0个或以上),声明时用”…”表示。固定参数和可选参数共同构成可变参数函数的参数列表。 为了使用可变参数,需要包含stdarg.h头文件,该文件提供了实现可变参数功能的函数和宏。具体步骤如下:
- 定义一个函数,最后一个参数为省略号,省略号前面可以设置自定义参数。
- 在函数定义中创建一个va_list类型变量,该类型是在 stdarg.h 头文件中定义的。
- 使用int参数和va_start宏来初始化va_list变量为一个参数列表。宏 va_start 是在 stdarg.h 头文件中定义的。
- 使用va_arg宏和va_list变量来访问参数列表中的每个项。
- 使用宏va_end来清理赋予va_list变量的内存。 例:
// 函数add() 计算可选参数之和
// 参数:第一个强制参数指定了可选参数的数量,可选参数为double类型
// 返回值:和值,double类型
double add( int n, ... )
{
int i = 0;
double sum = 0.0;
va_list argptr;
va_start( argptr, n ); // 初始化argptr
for ( i = 0; i < n; ++i ) // 对每个可选参数,读取类型为double的参数,
sum += va_arg( argptr, double ); // 然后累加到sum中
va_end( argptr );
return sum;
}