logo
Подбельский Фомин_Программирование на языке СИ_

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

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

Обобщенный формат директивы препроцессора:

#имя_директивы лексемы_препроцессора

Перед символом '#' и после него в директиве разрешены пробелы. Пробелы также разрешены перед лексемами препроцессора, между ними и после них. Окончанием препроцессорной директивы служит конец текстовой строки (при наличии символа '\', обозначающего перенос строки, окончанием препроцессорной директивы будет признак конца следующей строки текста).

Определены следующие препроцессорные директивы:

#define - определение макроса или препроцессорного идентификатора;

#include - включение текста из файла;

#undef - отмена определения макроса или идентификатора (препроцессорного);

#if - проверка условия-выражения;

#ifdef - проверка определенности идентификатора;

#ifndef - проверка неопределенности идентификатора;

#else - начало альтернативной ветви для #if;

#endif - окончание условной директивы #if;

#elif - составная директива #else/#if;

#line - смена номера следующей ниже строки;

#error - формирование текста сообщения об ошибке трансляции;

#pragma - действия, предусмотренные реализацией;

# - пустая директива.

Кроме препроцессорных директив имеются три препроцессорные операции, которые будут подробно рассмотрены вместе с командой #deline:

defined - проверка истинности операнда;

## - конкатенация препроцессорных лексем;

# - преобразование операнда в строку символов.

Директива #define имеет несколько модификаций. Они предусматривают определение макросов и препроцессорных идентификаторов, каждому из которых ставится в соответствие некоторая символьная последовательность. В последующем тексте программы препроцессорные идентификаторы заменяются на заранее запланированные последовательности символов. Примеры определения констант с помощью #define приведены в главе 1.

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

Директива #undef отменяет действие директивы #define, которая определила до этого имя препроцессорного идентификатора.

Директива #if и ее модификации #ifdef, #ifndef совместно с директивами #else, #endif, #elif позволяют организовать условную обработку текста программы. При использовании этих средств компилируется не весь текст, а только те его части, которые выделены с помощью перечисленных директив.

Директива #line позволяет управлять нумерацией строк в файле с программой. Имя файла и желаемый начальный номер строки указываются непосредственно в директиве #line (подробнее см. §3.6).

Директива #error позволяет задать текст диагностического сообщения, которое выводится при возникновении ошибок.

Директива #pragma вызывает действия, зависящие от реализации, т.е. запланированные авторами компилятора.

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

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