Директивы препроцессора в С++
Препроцессором называется первая фаза компилятора. Инструкции препроцессора называются директивами. Они должны начинаться с символа #, перед которым в строке могут находиться только пробельные символы.
Директива #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, а вместо макросов — встроенные функции или шаблоны.
Директива #include
Директива #include <имя_файла> вставляет содержимое указанного файла в ту точку исходного файла, где она записана. Включаемый файл может содержать директивы #include. Поиск файла, если не указан полный путь, ведется в стандартных каталогах включаемых файлов.
Вместо угловых скобок могут использоваться кавычки (" ") — в этом случае поиск файла ведется в каталоге, содержащем исходный файл, а затем уже в стандартных каталогах.
Директива #include -простейшее средство обеспечения согласованности объ-явлений в различных файлах, она включает в них информацию об интерфейсе из заголовочных файлов.
Заголовочные файлы обычно имеют расширение .h и могут содержать:
• определения типов, констант, встроенных функций, шаблонов, перечислений;
• объявления функций, данных, имен, шаблонов;
• пространства имен;
• директивы препроцессора;
• комментарии.
В заголовочном файле не должно быть определений функций и данных. Эти правила не являются требованием языка, а отражают разумный способ использования директивы. При указании заголовочных файлов стандартной библиотеки расширение .h можно опускать. Это сделано для того, чтобы не ограничивать способы их хранения. Для каждого файла библиотеки С с именем
Пример.
Директива #1nclucle
Директива #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, а вместо макросов — встроенные функции или шаблоны.