logo
ответы

79. Функции с переменным числом параметров

Одним из представителей подобных функций является, например, функция printf (), используемая в языках C и C++ для вывода данных:

void main()

{

int a = 10, b = 20;

char *str = "Это текст";

printf("a = %d, с = %s, b = %d", a, str, b);

}

Эта функция может принимать произвольное число аргументов в зависимости от структуры первого аргумента, задающего так называемую строку формата. В строке формата каждый символ % означает подстановку соответствующего аргумента из перечисленных за строкой формата. Количество подставляемых аргументов должно соответствовать количеству символов % в стоке формата и может быть любым.

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

1. При разработке тела функции необходимо использовать макросы для работы со списками аргументов функций. Для их использования в программу необходимо включить заголовочный файл <stdarg.h>:

#include <stdarg.h>

2. В списке параметров заголовка функции должен присутствовать хотя бы один обязательный параметр, после которого следуют необязательные параметры, обозначенные тремя точками. Например:

double Summa (int N, …)

Здесь в списке параметров присутствует один обязательный параметр N, за которым могут следовать необязательные параметры. Необязательные параметры должны всегда находиться в конце списка параметров.

3. В теле функции необходимо определить переменную для работы со списком параметров (тип данных этой переменной va_list определен в <stdarg.h>), значение которой инициализируют с помощью макроса va_start (он также принадлежит <stdarg.h>). Перед завершением работы функции необходимо (обязательно!) с помощью макроса va_end очистить стек программы от необязательных параметров функции:

{

va_list L; // Объявляем переменную для списка параметров

va_start (L, N); // Инициализируем переменную списка параметров

……….

va_end (L); // Очищаем стек

return ………;

}

Макрос va_start имеет два параметра. Первый – это переменная списка параметров. Второй – имя последнего обязательного параметра функции (параметра, который находится в списке параметров непосредственно перед необязательными параметрами).

4. Получение очередного параметра из списка необязательных параметров осуществляется с помощью макроса va_arg (), например, так:

double R = 0;

for (int I = 0; I < N; ++ I)

R += va_arg (L, double);

Параметрами макроса va_arg являются переменная списка параметров и тип данных очередного параметра из списка.

Приведенные выше “заготовки” приводят нас к функции, выполняющей суммирование N вещественных значений:

#include <iostream>

#include <stdio.h>

#include <stdarg.h>

using namespace std;

double Summa (int N, …)

{

va_list L; // Объявляем переменную для списка параметров

va_start (L, N); // Инициализируем переменную списка параметров

double R = 0;

for (int I = 0; I < N; ++ I)

R += va_arg (L, double); // Добавляем к R очередной аргумент

va_end (L); // Очищаем стек

return R;

}

int main ()

{

cout << Summa (3, 10.0, 20.0, 30.0) << endl; // 60

cout << Summa (5, 10.0, 20.0, 30.0, 40.0, 50.0) << endl; // 150

return 0;

}