Директивы препроцессора #define и #undef

Основные понятия препроцессорной обработки

Препроцессорная обработка (макрообработка) — это преобразование текста путем замены препроцессорных переменных их значениями и выполнения препроцессорных операторов (директив препроцессора).

В общем случае препроцессорные средства включают:

- определение препроцессорных переменных и присвоенных им значений;

- средства управления просмотром преобразуемого текста;

- правила подстановки значений макропеременных.

Определение препроцессорной переменной часто называют макроопределением или макросом, а подстановку ее значения в обрабатываемый текст — макрорасширением.

Макрообработка состоит в последовательном просмотре исходного текста и выделения в нем лексем — сканировании текста. Если выделенная лексема является препроцессорной переменной, она заменяется на свое значение, т.е. строится макрорасширение. Если встречается препроцессорная директива, то она выполняется. Лексемы, не являющиеся препроцессорными переменными или директивами, переносятся в выходной текст без изменения. Результатом такой обработки является текст, не содержащий препроцессорных директив и препроцессорных переменных. Если исходный текст был программой на C или C++, то после макрообработки должен быть получен синтаксически правильный текст на C или C++.

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

Директива #include

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

#include <имя_файла>#include “имя_файла”#include идентификатор_макроса

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

Последняя форма предполагает, что первый значащий символ после слова include не равен ни `<`, ни `”`. Предполагается, что макрос, идентификатор которого используется в этой форме директивы, предварительно определён и использует одну из первых двух форм директивы #include.

Различие между первыми двумя формами директивы заключается в методе поиска препроцессором включаемого файла. Если имя файла заключено в угловые скобки (< и >), как это делается для включения заголовочных файлов стандартной библиотеки, то последовательность поиска препроцессором заданного файла в каталогах определяется заданными каталогами включения (include directories). Если же имя файла заключено в кавычки, препроцессор ищет файл, просматривая каталоги в следующей последовательности:

- каталог того файла, который содержит директиву #include;

- каталоги файлов, которые включили в данный файл директивой #include;

- текущий каталог;

- каталоги, указанные опцией компилятора /I;

- каталоги, заданные переменной окружения INCLUDE.

Однако данный поиск производится только в том случае, если имя файла указано без пути к нему. Если файл в директиве указан с путём, то никакие другие каталоги не просматриваются.

Обработка директивы #include препроцессором сводится к тому, что директива убирается из текста и на её место заносится копия указанного файла. Директива #include обычно используется для включения стандартных заголовочных файлов библиотек и для включения заголовочных файлов в файлы их реализации. Также используется при работе с программами, состоящих из нескольких исходных файлов.

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

Директивы препроцессора #define и #undef


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: