Открыть главное меню

В программировании функции с переменным числом аргументов называются вариативными.

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

Содержание

Пример в CПравить

Для реализации функций с переменным числом аргументов в языке программирования 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.

  1. va_start принимает два аргумента, объект va_list  и ссылку на последний параметр функции (тот, что перед многоточием). Она инициализирует va_list объект для использования в va_arg или va_copy. Компилятор обычно выдает предупреждение, если ссылка неверная (например, ссылка на параметры, отличающиеся от последнего, или ссылка на совершенно другой объект).
  2. va_arg принимает два аргумента, va_list объект (ранее инициализированный) и дескриптор типа. Он расширяется на следующей переменной аргумент, и имеет указанный тип. Каждый следующий вызов возвращает следующий аргумент.
  3. va_end принимает один аргумент типа va_list и очищает его. Если вы хотели, например, сканировать переменное число аргументов более чем один раз, вам надо будет повторно инициализировать va_list путём вызова va_end и затем va_start.
  4. va_copy принимает два аргумента, оба типа va_list. Он дублирует второй (который должен был быть инициализирован) в первый.

См. такжеПравить

ПримечанияПравить

СсылкиПравить