Cprogramming 简明教程

Variable Arguments in C

有时您可能会遇到一种情况,其中希望有一个可以接受可变数量的参数(而不是预定义数量的参数)的函数。C 编程语言为这种情况提供了解决方案。

阅读本章以了解如何根据您的要求定义可接受可变数量的参数的函数。

以下示例显示了这样的函数的 definition

int func(int, ... ) {
   ...
   ...
}

int main() {
   func(1, 2, 3);
   func(1, 2, 3, 4);
}

应该指出,函数 func() 的最后一个参数是 ellipses ,即三个点(…​),而紧挨在省略号之前的参数始终是一个 int ,它表示传入的总数量可变参数。

要实现这样的功能,您需要使用 stdarg.h 头文件,它提供了实现可变参数功能的函数和宏。

按照以下步骤操作 −

  1. 将一个函数的最后一个参数定义为省略号,而紧挨在省略号之前的参数始终是一个 int ,它将表示参数的数量。

  2. 在函数定义中创建 va_list 类型变量。此类型在 stdarg.h 头文件中定义。

  3. 使用 int 参数和 va_start 宏将 va_list 变量初始化为参数列表。宏 va_start 在 stdarg.h 头文件中定义。

  4. 使用 va_arg 宏和 va_list 变量访问参数列表中的每个项目。

  5. 使用宏 va_end 清理分配给 va_list 变量的内存。

Example

现在让我们遵循上述步骤,写一个可以采用可变数量的参数并返回其平均值的简单函数 −

#include <stdio.h>
#include <stdarg.h>

double average(int num,...) {

   va_list valist;
   double sum = 0.0;
   int i;

   /* initialize valist for num number of arguments */
   va_start(valist, num);

   /* access all the arguments assigned to valist */
   for (i = 0; i < num; i++) {
      sum += va_arg(valist, int);
   }

   /* clean memory reserved for valist */
   va_end(valist);

   return sum/num;
}

int main() {

   printf("Average of 2, 3, 4, 5 = %f\n", average(4, 2,3,4,5));
   printf("Average of 5, 10, 15 = %f\n", average(3, 5,10,15));
}

Output

编译并执行上述代码会产生以下输出:

Average of 2, 3, 4, 5 = 3.500000
Average of 5, 10, 15 = 10.000000

应该指出,函数 average() 被调用了两次,而每次第一个参数都表示要传递的可变参数的总数。只使用省略号来传递可变数量的参数。