Глава 11. функции__________________________________________255
работу по идентификации аргументов в соответствии с некоторыми условиями и извлечению фактических значений путем замысловатых манипуляций со стеком (этот механизм более подробно освещен в главе 6 "Базовые типы данных и операции", на примерах некоторых функций из файла stdio.h).
Списки аргументов переменной длины по-прежнему ограниченно применяются в некоторых специализированных программах, например, в процедурах обработки прерываний (Interrupt Service Routines, ISR). Изначально такие списки были введены для того, чтобы обеспечить возможность обойтись .одной функцией при работе с аргументами разных типов. Например, для того чтобы научиться выводить величины базовых типов данных, достаточно только функции printf. Ныне же списки переменной длины утратили большую часть своей привлекательности, поскольку в большинстве ситуаций их возможности с лихвой перекрываются перегрузкой функций (см. главу 15).
Замечание
Функции обработки прерываний входят в состав базовой системы ввода-вывода (Basic Input/Output System, BIOS), драйверов устройств и ядер операционных систем (DOS, Windows и всех прочих). Они являются системными функциями, активизируемыми различными событиями программного или аппаратного характера, например, нажатием клавиши. В момент нажатия генерируется прерывание и операционная система временно приостанавливает работу и передает управление соответствующей процедуре обработки.
С этой темой тесно связаны такие понятия, как ISR, обработчики событий, векторы прерываний, функции обратного вызова и функторы Последние представляют собой мост между программой и всем вышеперечисленным. Функторы мы рассмотрим ближе к концу этой главы.
Вот, например, как список переменной длины фигурирует в объявлении функции:
int printf( const char*, ...);
Необходимость списков переменной длины в обработчиках прерываний объясняется тем, что различные функции одного и того же прерывания оперируют с разным количеством регистров. При объявлении процедуры обработки прерывания используется ключевое слово interrupt:
void interrupt new_int4A(...); // Прерывание DOS Ox4A (будильник)
Процедуры обработки прерываний обычно используются в довольно специализированных приложениях; Windows 95 может не вполне дружелюбно отнестись к тем обработчикам прерываний, которые вы привыкли писать для DOS.