Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PYaVU_s.doc
Скачиваний:
44
Добавлен:
24.02.2016
Размер:
665.09 Кб
Скачать
      1. Вызовы с переменным числом аргументов

Чтобы вызвать функцию с переменным числом аргументов, в вызове функции просто задается любое число аргументов. В forward-объявлении (если оно есть) переменное число аргументов специфицируется записью запятой с последующим многоточием (,...) в конце списка типов аргументов (смотри раздел 4.5.). Каждому имени типа, специфицированному в списке типов аргументов, соответствует один фактический аргумент в вызове функции. Если задано только многоточие (без имен типов), то это значит, что нет аргументов, которые обязательно требуются при вызове функции.

Аналогично, список аргументов в определении функции может также заканчиваться запятой с последующим многоточием (,...), что подразумевает переменное число аргументов. Если список аргументов содержит только многоточие (...), то число аргументов переменно или равно нулю. Более подробная информация дана в разделе 7.2.

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

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

      1. Рекурсивные вызовы

Любая функция в Си-программе может быть вызвана рекурсивно. Для этого функция вызывает саму себя. Компилятор Си допускает любое число рекурсивных вызовов функции. При каждом вызове формальных параметров и переменных класса памяти auto и register захватывается новая память, так что их значения из предшествующих незаверщенных вызовов не перезаписываются. Предшествующие параметры недоступны в других версиях функции, исключая версию, в которой они были созданы.

Заметим, что переменные, объявленные как глобальные, не требуют новой памяти при каждом рекурсивном вызове. Их память сохраняется на все время жизни программы.

Хотя Си компилятор не ограничивает число рекурсивных вызовов функции, операционное окружение может налагать практические ограничения. Так как каждый рекурсивный вызов требует дополнительной стековой памяти, то слишком много рекурсивных вызовов могут переполнить стек.

  1. Директивы препроцессора и указания компилятору

Директивы препроцессора - это инструкции, предназначенные для препроцесора Си. Препроцессор Си - это текстовый процессор, используемый для обработки текстового исходного файла на первой фазе компиляции. Компилятор обычно вызывает препроцессор в своем первом проходе, однако препроцессор может быть вызван автономно для обработки текста без компиляции.

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

Препроцессор Си распознает следующие директивы:

#define

#if

#line

#elif

#ifdef

#undef

#else

#ifndef

#endif

#include

Знак номера (#) должен быть первым (без предшествующих пробельных символов) в строке, содержащей директиву. Некоторые директивы требуют аргументы или значения. Директивы могут появляться где угодно в исходном файле, но они применимы только к остатку исходного файла от места, где они появились.

Указания компилятору - это команды, которые вставляются в текст исходной программы Си и используются для управления действиями компилятора в определенных частях программы, не влияя на программу в целом. Смотрите системную документацию для получения информации об использовании и действиях указаний компилятору.