Переменное количество параметров

Количество параметров в функции может быть произвольным, при условии, что существует один обязательный параметр. В объявлении и определении функции переменное число параметров обозначается тремя точками. Например, прототип функции printf() выглядит так:

int printf(const char *format, ...);

Получить доступ к этим параметрам внутри функции можно с помощью специальных макросов va_start(), va_arg() и va_end():

#include <cstdarg> /* или #include <stdarg.h> */
void va_start(va_list <Указатель>, <Последний параметр>)
<Значение> va_arg(va_list <Указатель>, <Тип данных>)
void va_end(va_list <Указатель>)

Вначале объявляется указатель типа va_list. Далее должна производиться инициализация указателя с помощью макроса va_start(). В первом параметре передается указатель, а во втором — название последнего обязательного параметра. Доступ к параметрам осуществляется с помощью макроса va_arg(), который возвращает значение текущего параметра и перемещает указатель на следующий параметр. В первом параметре макроса va_arg() передается указатель, а во втором — название типа данных. Макрос va_end() сообщает об окончании перебора параметров. Количество параметров обычно указывается в обязательном параметре в виде числа или определяется другим способом (например, количеством спецификаторов внутри строки формата функции printf()).

Если ожидается произвольное количество значений, то их может не быть и вовсе:

printf("10 20");                   // 10 20

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

Листинг 12.16. Суммирование произвольного количества целых чисел

#include <iostream>
#include <cstdarg>

int sum(int n, ...);

int main() {
   std::cout << sum(2, 20, 30) << std::endl;     // 50
   std::cout << sum(3, 1, 2, 3) << std::endl;    // 6
   std::cout << sum(4, 1, 2, 3, 4) << std::endl; // 10
   return 0;
}
int sum(int n, ...) {
   int result = 0;
   va_list p;
   va_start(p, n);
   for (int i = 0; i < n; ++i) {
      result += va_arg(p, int);
   }
   va_end(p);
   return result;
}
На заметку

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов