Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Директивы препроцессора.doc
Скачиваний:
7
Добавлен:
20.07.2019
Размер:
206.34 Кб
Скачать

Пример:

Если для переопределения константы M использовать последовательность директив

#define M 16

#undef M

#define М ‘С’

#undef M

#define M “С”

никаких предупреждающих сообщений выдано не будет (как это было в рассмотренном ранее примере без использования директивы #undef).

Директива #undef используется редко, напри­мер, для отключения какой-либо опции компилятора.

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

В этом случае могут встретиться одинаковые обозначе­ния различных объектов. Чтобы не изменять исходных файлов, включаемый текст можно обрамлять директи­вами #define, #undef и тем самым устранять возможные ошиб­ки.

Пример:

А = 10; // Основной текст

#define A X

А = 5; // Включенный текст

#undef A

В = А; // Основной текст

При выполнении программы переменная В примет значение 10, несмотря на наличие оператора присваивания А = 5; во включенном тексте.

Директива #include вставляет в текст программы описания из указанного файла, в ту точку, где эта директива записана.

Данная директива имеет две формы записи:

#include <имя_файла>

#include “имя_файла”

Имя файла может быть указано с расширением. Конструкция, указывающая имя файла, может являться вызовом макроса, введенного директивой #define, который за конечное число подстановок формирует последовательность символов <имя_файла> либо “имя файла”.

Файлы, имеющие расширение .h, называются заголовочными файлами (header file). Они могут содержать:

  • определения типов, констант, встроенных функций, шаблонов, перечислений;

  • объявления функций, данных, имен, шаблонов;

  • пространства имен;

  • директивы препроцессора;

  • комментарии.

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

В форме заголовочных файлов оформляются описания функций стандартных библиотек, а также определения и описания типов и констант, используе­мых при работе с библиотеками компилятора. Например, заголовочных файл stdio.h содержит описание функции ввода/вывода printf, scanf и др. Каталог заголовочных файлов поставляется вместе со стандартными библиотеками компилятора.

Для подключения стандартных заголовочных файлов, используется первая форма записи (имя заключается в угловые скобки). В этом случае поиск файла ведется в стандартных каталогах заголовочных файлов. Например, для включения в текст программы заголовочного файла stdio.h используется директива

#include < stdio.h >.

Стандартные заголовочные файлы могут быть включены в текст программы в любом порядке и по несколько раз без отрицательных побочных эффектов. Однако действие включаемого заголовочного файла распространяется на текст программы только в пределах одного модуля от места размещения директивы #include и до конца текстового файла (и всех включаемых в программу текстов).

Перечень заголовочных файлов утвержден стандартом языка. Перечислим некоторые заголовочные файлы языка С++:

float.h - работа с вещественными данными

limits.h - предельные значения целочисленных данных

matb.h - математические вычисления

stdio.h - средства ввода-вывода

string.h - работа со строками символов

time.h - определение дат и времени

В конкретных реализациях состав и наименования заголовочных файлов могут отличаться. Например, в компиляторах для MS-DOS активно используются файлы mem.h, alloc.h, conio.h, dos.h, graphics.h и др.

Для каждого файла библиотеки С с именем <name.h> имеется соответст­вующий файл библиотеки C++ <cname>, в котором те же средства описываются в пространстве имен std. Например, директива #include <cstdio> обеспечивает те же возможности, что и #include <stdio.h>, но при обращении к стандартным функциям требуется указывать имя пространства имен std.

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

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

Внешние объекты должны записываться в заголовочном файле со спецификатором extern. Например: