C - Переменные аргументы
Иногда вы можете столкнуться с ситуацией, когда вы хотите иметь функцию, которая может принимать переменное количество аргументов, то есть параметров, вместо предопределенного количества параметров. Язык программирования C предоставляет решение для этой ситуации, и вам разрешено определять функцию, которая может принимать переменное количество параметров в зависимости от ваших требований. В следующем примере показано определение такой функции.
int func(int, ... ) { . . . } int main() { func(1, 2, 3); func(1, 2, 3, 4); }
Следует отметить, что функция func() имеет последний аргумент в виде многоточия, то есть три точки (... ), а непосредственно перед многоточием всегда int который будет представлять общее число переданных аргументов переменной. Чтобы использовать такую функциональность, вам нужно использовать stdarg.h заголовочный файл, который предоставляет функции и макросы для реализации функциональности переменных аргументов и выполнения заданных шагов —
-
Определите функцию с последним параметром в виде многоточия, а тот, что непосредственно перед многоточием, всегда является int который будет представлять количество аргументов.
-
Создайте va_list введите переменную в определении функции. Этот тип определен в заголовочном файле stdarg.h.
-
Используйте целое параметр и 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() был вызван дважды, и каждый раз первый аргумент представляет собой общее количество передаваемых переменных аргументов. Для передачи переменного количества аргументов будут использоваться только многоточия.
Average of 2, 3, 4, 5 = 3.500000 Average of 5, 10, 15 = 10.000000
Язык C