Учебники

C — Переменные аргументы

Иногда вы можете столкнуться с ситуацией, когда вы хотите иметь функцию, которая может принимать переменное количество аргументов, то есть параметров, вместо предопределенного количества параметров. Язык программирования C предоставляет решение для этой ситуации, и вы можете определить функцию, которая может принимать переменное количество параметров в зависимости от ваших требований. В следующем примере показано определение такой функции.

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

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

Следует отметить, что функция func () имеет свой последний аргумент в виде эллипсов, то есть три точки ( ) и одна перед эллипсами всегда представляет собой целое число, представляющее общее число переданных аргументов переменной. Чтобы использовать такую ​​функциональность, вам нужно использовать файл заголовка stdarg.h, который предоставляет функции и макросы для реализации функциональности переменных аргументов и выполнения указанных шагов —

  • Определите функцию с последним параметром в виде эллипсов, а перед параметром эллипсы всегда будет int, который будет представлять число аргументов.

  • Создайте переменную типа va_list в определении функции. Этот тип определен в заголовочном файле stdarg.h.

  • Используйте параметр int и макрос va_start, чтобы инициализировать переменную va_list в список аргументов. Макрос va_start определен в заголовочном файле stdarg.h.

  • Используйте макрос va_arg и переменную va_list для доступа к каждому элементу в списке аргументов.

  • Используйте макрос va_end, чтобы очистить память, назначенную переменной va_list .

Определите функцию с последним параметром в виде эллипсов, а перед параметром эллипсы всегда будет int, который будет представлять число аргументов.

Создайте переменную типа va_list в определении функции. Этот тип определен в заголовочном файле stdarg.h.

Используйте параметр int и макрос va_start, чтобы инициализировать переменную va_list в список аргументов. Макрос va_start определен в заголовочном файле stdarg.h.

Используйте макрос va_arg и переменную va_list для доступа к каждому элементу в списке аргументов.

Используйте макрос va_end, чтобы очистить память, назначенную переменной va_list .

Теперь давайте выполним описанные выше шаги и запишем простую функцию, которая может принимать переменное количество параметров и возвращать их среднее значение —

Live Demo

#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));
}

Когда приведенный выше код компилируется и выполняется, он дает следующий результат. Следует отметить, что функция Average () вызывается дважды, и каждый раз, когда первый аргумент представляет общее количество передаваемых переменных переменных. Только эллипсы будут использоваться для передачи переменного количества аргументов.