- •Стадии препроцессорной обработки
- •Макроопределение без параметров
- •Пример:
- •Пример:
- •Пример:
- •Цепочка подстановок
- •Сравнение макросов и функций
- •Пример:
- •Пример:
- •Пример:
- •Int II, jj, ll; // целые внешние переменные
- •Условная компиляция
- •Пример:
- •Пример:
- •Пример:
- •Вспомогательные директивы
- •Пример:
- •Void main ( ) // строка 2
- •Пример:
Пример:
Если для переопределения константы 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. Например: