C使用 stdarg 宏来实现函数的可变参数列表

  • 先贴一个代码实例,然后再进行讲解:
    • #include 
      #include 
      
      float average(int n_values, ...) {
          va_list var_arg;
      	int count;
      	float sum = 0;
      
      	va_start(var_arg, n_values);
      
      	for (count = 0; count < n_values; count++) {
      	    sum += va_arg(var_arg, int);
      	}
      
      	va_end(var_arg);
      
      	return sum / n_values;
      }
      
      int main(void) {
          printf("The average of 1, 2, 3, 4, 5 is : %f\n", average(5, 1, 2, 3, 4, 5));
      	printf("The average of 1, 2, 3, 4, 5, 6 is : %f\n", average(6, 1, 2, 3, 4, 5, 6));
      	return 0;
      }



  • 函数声明了一个类型为 va_list (定义于 strarg.h 中) 的变量 var_arg ,它用于访问函数参数列表的未确定部分
  • 接着这个变量 (va_arg) 通过调用函数 va_start 来初始化,va_atart 接受两个参数:
    • 第一个参数为 va_list 变量的名字
    • 第二个参数为省略号前最后一个有名字的参数
    • 初始化过程把变量 var_arg 指向函数参数参数列表可变部分的第一个参数
  • 接着使用函数 va_arg 来依次访问函数可变参数列表部分的参数,va_arg 函数接受两个参数:
    • 第一个参数为 va_list 变量
    • 第二个为欲访问的可变参数列表的参数的类型

    • 在这个例子中这个参数类型 int 恰好是所有参数的类型,在更通常的情况你可能学要根据前一个参数的类型来推测后一个参数的类型

    • 函数 va_arg 返回这个参数的值,并使得 va_arg 指向列表的下一个可变参数
  • 最后当访问完最后一个参数后需要调用函数 va_end 来销毁一些相关的变量

  • 使用可变参数的限制:


  • 其它在使用可变参数列表时需要注意的:

    • C使用 stdarg 宏来实现函数的可变参数列表_第1张图片

你可能感兴趣的:(C)