Директивы препроцессора в С++

Препроцессором называется первая фаза компилятора. Инструкции препроцессора называются директивами. Они должны начинаться с символа #, перед которым в строке могут находиться только пробельные символы.

Директива #include

Директива #include <имя_файла> вставляет содержимое указанного файла в ту точку исходного файла, где она записана. Включаемый файл может содержать директивы #include. Поиск файла, если не указан полный путь, ведется в стандартных каталогах включаемых файлов.

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

Директива #include -простейшее средство обеспечения согласованности объ-явлений в различных файлах, она включает в них информацию об интерфейсе из заголовочных файлов.

Заголовочные файлы обычно имеют расширение .h и могут содержать:
• определения типов, констант, встроенных функций, шаблонов, перечислений;
• объявления функций, данных, имен, шаблонов;
• пространства имен;
• директивы препроцессора;
• комментарии.

В заголовочном файле не должно быть определений функций и данных. Эти правила не являются требованием языка, а отражают разумный способ использования директивы. При указании заголовочных файлов стандартной библиотеки расширение .h можно опускать. Это сделано для того, чтобы не ограничивать способы их хранения. Для каждого файла библиотеки С с именем имеется соответствующий файл библиотеки C++ , в котором те же средства описыва-ются в пространстве имен std.

Пример.

Директива #1nclucle обеспечивает те же возможности, что и #1nclude , но при обращении к стандартным функциям требуется указывать имя пространства имен.

Директива #define

Директива определяет подстановку в тексте программы.

Используется для определения:

• символических констант:

#def1ne имя текст_подстановки (все вхождения имени заменяются на текст подстановки);

• макросов, которые выглядят как функции, но реализуются подстановкой их текста в текст программы:

#define имя( параметры ) текст_подстановки

• символов, управляющих условной компиляцией.

Они используются вместе с директивами #ifdef и #ifndef.

Формат: #define имя

Примеры:

#define VERSION 1
#def1ne VASIA "Василий Иванович"
#define МАХ(х,у) ((x)>(y)?(x):(y))
#define MUX

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

у = MAX(suml. sum2);

он будет заменен на

у = ((suml)>(sum2)?(suml):(sum2));

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

Например, если к макросу #def1ne sqr(x) (х*х) обратиться как sqr(y+l), в результате подстановки получится выражение (у+1*у+1).

Макросы и символические константы унаследованы из языка С, при написании программ на C++ их следует избегать. Вместо символических констант предпочтительнее использовать const или enum, а вместо макросов — встроенные функции или шаблоны.
Онлайн всего: 1
Гостей: 1
Пользователей: 0

STUDLAB Сообщить про опечатку на сайте