Информатика и технология программирования


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


Ранее (см. 3.6) мы уже рассматривали, как используется стек для вызова функций, передачи параметров и хранения локальных (автоматических) переменных. Фактические параметры записываются в стек перед вызовом функции, начиная с последнего в списке. Поскольку аппаратный стек расположен "вверх дном" и "растет" от старших адресов к младшим, то этим обеспечивается прямой порядок размещения их в памяти. Формальные параметры представляют собой "ожидаемые" смещения в стеке, по которым должны после вызова находиться соответствующие фактические параметры. Таким образом, сам механизм вызова функции соответствие параметров устанавливает только "по договоренности" между вызывающей и вызываемой функциями, а транслятор при использовании прототипа проверяет эти соглашения.

Поскольку фактические параметры записываются в стек и извлекаются из него вызывающей функцией, а используются вызываемой по смещениям в стеке, то имеет место независимость формальных и фактических параметров. В частности, если в списке есть лишние параметры, то вызов будет корректен, а вызываемая функция просто их "не заметит". Отсюда один шаг к использованию переменного количества фактических параметров: достаточно установить некоторый указатель на область памяти (область стека), занимаемую "лишними" фактическими параметрами, и тогда с помощью его и операций адресной арифметики функция может просмотреть их последовательность.

Текущее количество фактических параметров, передаваемых при вызове, может быть указано:



-отдельным параметром -счетчиком;



-параметром ограничителем, значение которого отмечает конец списка параметров;



-форматной строкой, в которой перечислены спецификации параметров (например, функция printf).

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




Начало  Назад  Вперед