Включение текстов из файлов
Для включения текста из файла используется команда #include, имеющая три формы записи: #include < имя_файла > /* Имя в угловых скобках */ #include “имя_файла” /* Имя в кавычках */ #include имя_макроса /* Макрос, расширяемый до обозначения файла*/
где имя_макроса – это введенный директивой #define пpeпpoцессорный идентификатор, либо макрос, при замене которого после конечного числа подстановок будет получена последовательность символов < имя _ файла> либо “имя_файла”. Существует правило, что если имя_файла – в угловых скобках, то препроцессор разыскивает файл в стандартных системных каталогах. Если имя_файла заключено в кавычки, то вначале препроцессор просматривает текущий каталог пользователя и только затем обращается к просмотру стандартных системных каталогов. При необходимости использования в программах средств ввода-вывода в начале текста программы помещают директиву: #include < stdio.h>
Выполняя эту директиву, препроцессор включает в программу средства связи с библиотекой ввода-вывода. Поиск файла stdio.h ведется в стандартных системных каталогах. По принятому соглашению суффикс .h приписывается тем файлам, которые содержат прототипы библиотечных функций, а также определения и описания типов и констант, используемых при работе с библиотеками компилятора. Эти файлы принято называть заголовочными. Кроме такого stdio.h, в заголовок программы могут быть включены любые другие файлы (стандартные или подготовленные специально). Перечень обозначений заголовочных файлов для работы с библиотеками компилятора утвержден стандартом языка. Ниже приведены названия этих файлов, а также краткие сведения о тех описаниях и определениях, которые в них включены. Большинство описаний – прототипы стандартных функций, в stdio.h, определены в основном константы (например NULL, EOF), необходимые для работы с библиотечными функциями. Все имена, определенные в стандартных заголовочных файлах, являются зарезервированными именами: assert.h – Диагностика программ ctype.h – Преобразование и проверка символов errno.h – Проверка ошибок float.h – Работа с вещественными данными limits.h – Предельные значения целочисленных данных locate.h – Поддержка национальной среды math.h – Математические вычисления setjump.h – Возможности нелокальных переходов signal.h – Обработка исключительных ситуаций stdarg.h – Поддержка переменного числа параметров stddef.h – Дополнительные определения stdio.h – Средства ввода-вывода stdlib.h – Функции общего назначения (работа с памятью) string.h – Работа со строками символов time.h – Определение дат и времени В конкретных реализациях количество и наименования заголовочных файлов могут быть и другими. Действие включаемого заголовочного файла распространяется на текст программы только в пределах одного модуля от места размещения директивы #include и до конца текстового файла (и всех включаемых в программу текстов). Заголовочные нестандартные файлы оказываются весьма эффективным средством при модульной разработке крупных программ, когда связь между модулями, размещаемыми в разных файлах, реализуется не только с помощью параметров, но и через внешние объекты, глобальные для нескольких или всех модулей. Описания таких внешних объектов (переменных, массивов, структур и т.п.) и прототипы функций помещаются в одном файле, который с помощью директив #include включается во все модули, где необходимы внешние объекты. В тот же файл можно включить и директиву подключения файла с описаниями библиотеки функций ввода-вывода. Заголовочный файл может быть, например, таким: Пример 10.9 #include < stdio.h> /* Включение средств обмена */ /* Целые внешние переменные */ extern int ii, jj, 11; /* Вещественные внешние переменные */ extern float aa, bb;
Если в программе используется несколько функций, то часто удобно текст каждой из них хранить в отдельном файле. При подготовке программы в виде одного модуля в нее включаются тексты всех функций с помощью команд #include. Например, запрограммирована задача формирования гистограммы с целью оценки последовательности псевдослучайных чисел. При разработке программы выделены шесть функций и введены внешние переменные, которые должны быть доступны для этих функций. Список неглавных функций (их прототипы) получается таким:
Пример 10.10 void count(void); void estimate (double *, double *, double *); void compare (double, double); double gauss (double, double); int pseudorand (void);
В тексты всех перечисленных функций, а также в функцию main() помещены прототипы вызываемых функций. Кроме того, в каждой функции описаны со спецификатором extern все внешние объекты, доступ к которым нужен в теле функции. Такое размещение описаний и определений допускает произвольный порядок размещения текстов функций в программном файле. Если в качестве имен файлов с текстами функций программы выбраны идентификаторы, близкие к именам функций, то возможен следующий текст программы (одни процессорные команды):
Пример 10.11 #include “main.с” #include “count.с” #include “estimate.с” #include “compare.с” #include “gauss.c” #include “pseudo.c”
Имена файлов соответствуют именам функций с добавкой расширения “ .с ”. Как иллюстрирует этот пример, исходный текст программы может быть настолько сокращен, что будет содержать только директивы препроцессора. Препроцессор включает настоящие (реальные) тексты всех функций в программу и как единое целое (модуль) передает полученный текст на компиляцию.
|