Основы программирования для автоматизированного проектирования и решения творческих задач - 44 стр.

UptoLike

Составители: 

В языке С существует возможность создавать функции, у которых во время компиляции список
формальных параметров не определен и даже неизвестны типы данных, к которым могут принадлежать
передаваемые параметры. Типы параметров и их количество становится известным в процессе выпол-
нения программы. При определении и описании таких функций список формальных параметров должен
заканчиваться запятой и многоточием:
тип имя(список_явных_параметров, ...);
здесь список явных параметровсписок параметров, тип и количество которых известны на момент
компиляции.
Многоточие означает для компилятора, что контроль количества и типов параметров при обраще-
нии к функции проводить не надо. Главная сложность при работе со списком параметров переменной
длины состоит в том, что он не имеет имени, поэтому неизвестно его начало в оперативной памяти. Для
определения начала списка параметров переменной длины необходимо, чтобы функция имела хотя бы
один явный параметр.
Для нормальной работы со списком параметров переменной длины, функции прямо или косвенно
необходимо определиться с длиной списка (количеством элементов в нем в данный момент). Сущест-
вуют две идеи, объясняющие как выйти из сложившейся ситуации. Можно напрямую передавать функ-
ции число параметров в списке. Другим способом является помещение в конец списка признака его
окончания. В этом случае функция должна проверять наличие в списке кода окончания списка. Выборка
элементов из списка осуществляется с помощью указателей. Рассмотрим в качестве примера функцию
для подсчета суммы целых чисел.
П р и м е р 39
Явная передача в функцию числа параметров
long sum(int n, ...)
{
int *p = &n;
long s = 0;
for ( ; n; n--) s += *(++p);
return s;
}
Главным недостатком функции является ее неправильная работа при ошибке в задании числа аргумен-
тов.
П р и м е р 40
Нулевой код при окончании списка аргументов
long sum(int n, ...)
{
int *p = &n;
long s = 0;
for (; *p; p++) s += *p;
return s;
}
Недостатком в данном случае является невозможность использования кода окончания списка внутри
него как аргумента.
Для повышения мобильности, простоты и надежности функций, работающих со списками парамет-
ров переменной длины, могут быть использованы макросредства, описанные в заголовочном файле
stdarg.h. В этом заголовочном файле описаны макросы: