Иногда вы можете столкнуться с ситуацией, когда вы хотите иметь функцию, которая может принимать переменное количество аргументов, то есть параметров, вместо предопределенного количества параметров. Язык программирования 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 .
Теперь давайте выполним описанные выше шаги и запишем простую функцию, которая может принимать переменное количество параметров и возвращать их среднее значение —
#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 () вызывается дважды, и каждый раз, когда первый аргумент представляет общее количество передаваемых переменных переменных. Только эллипсы будут использоваться для передачи переменного количества аргументов.