可变参数


在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;
}