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