В программировании функции с переменным числом аргументов называются вариативными.
Существует множество математических и логических операций, которые лучше реализовать с помощью функций с переменным количеством аргументов, например, суммирование чисел или конкатенация строк.
Для реализации функций с переменным числом аргументов в языке программирования C нужно подключить заголовочный файл stdarg.h
. Прежде использовался varargs.h
, который был объявлен устаревшим. Для C++ этот заголовочный файл называется cstdarg
[1].
1 #include <stdarg.h>
2
3 double average(int count, ...)
4 {
5 va_list ap;
6 int j;
7 double sum = 0;
8
9 va_start(ap, count); /* Требуется последний известный аргумент (чтобы получить адрес первого неизвестного) */
10 for (j = 0; j < count; j++) {
11 sum += va_arg(ap, double); /* Увеличивает ap до следующего аргумента. */
12 }
13 va_end(ap);
14
15 return sum / count;
16 }
Эта функция позволяет вычислить среднее значение от произвольного количества аргументов. Обратите внимание, что функция не знает число аргументов и их типы. Вышеописанная функция ожидает, что типы будут double
и то, что число параметров передается в первом аргументе. В других случаях, например для функции printf(), число и типы аргументов выясняются из строки формата.
stdarg.h
объявляет тип va_list
, и определяет четыре макрофункции: va_start, va_arg
, va_copy
и va_end
.
va_start
принимает два аргумента, объект va_list
и ссылку на последний параметр функции (тот, что перед многоточием). Она инициализирует va_list
объект для использования в va_arg
или va_copy
. Компилятор обычно выдает предупреждение, если ссылка неверная (например, ссылка на параметры, отличающиеся от последнего, или ссылка на совершенно другой объект).va_arg
принимает два аргумента, va_list
объект (ранее инициализированный) и дескриптор типа. Он расширяется на следующей переменной аргумент, и имеет указанный тип. Каждый следующий вызов возвращает следующий аргумент.va_end
принимает один аргумент типа va_list и
очищает его. Если вы хотели, например, сканировать переменное число аргументов более чем один раз, вам надо будет повторно инициализировать va_list
путём вызова va_end
и затем va_start
.va_copy
принимает два аргумента, оба типа va_list. Он дублирует второй (который должен был быть инициализирован) в первый.Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".
Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.
Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .