Для управления препроцессорной обработкой (для задания нужных действий), используются директивы (команды) препроцессора.
Обобщенный формат директивы препроцессора:
#имя_директивы лексемы_препроцессора
Каждая директива должна располагаться в отдельной строке. До и после символа ‘#’, до, после и между лексемами препроцессора могут содержаться пробелы.
Окончанием препроцессорной директивы служит конец текстовой строки, при наличии символа ‘\’, обозначающего перенос строки - конец следующей строки текста.
Директива #define позволяет осуществлять макроподстановки – замены в тексте программы одной последовательности символов на другую. С помощью данной директивы также определяются символические константы, управляющие условной компиляцией, и используемые директивами #ifdef и #ifndef.
Директива #undef отменяет действие директивы #define.
Директива #includeпозволяет включать в текст программы текст из указанного файла.
Директивы #if, #ifdef, #ifndef, #else, #endif, #elifназывают директивами условной компиляции. Они позволяют организовать условную (в зависимости от результата выполнения некоторого условия) препроцессорную обработку текста программы. Таким образом, из последующего процесса компиляции можно исключить часть текста программы.
Директива #else определяет начало альтернативной ветви для директив #if, #ifdef, #ifndef, директива #endif – их окончание.
Директива #elif является составной директивой #else/#if.
Директива #line позволяет управлять нумерацией строк в файле с программой, а также изменять имя файла.
Директива #errorзадает текст сообщения, которое выводится при возникновении ошибок компиляции.
Директива #pragma вызывает действия, зависящие от конкретной реализации компилятора.
Директива # (пустая директива) ни выполняет никаких действий и всегда игнорируется.
Кроме препроцессорных директив имеются три препроцессорные операции Совместно с директивой #define:
· defined-проверка истинности операнда,
· ## - конкатенация препроцессорных лексем,
· # - преобразование операнда в строку символов (заключение в кавычки).
Директива #define имеет несколько модификаций:
1. #define идентификатор строка_замещения – макроопределение без параметров
2. #define идентификатор(параметры) строка_замещения – макроопределение с параметрами
3. #define идентификатор - определение идентификатора, управляющего условной компиляцией.
Рассмотрим подробнее реализацию первых двух модификаций. Использование третьей модификации будет обсуждаться при изучении директив условной компиляции.
Замена в тексте программы одной последовательности символов на другую называется макроподстановкой. Средство ее реализации называется макросом. Для выполнения макроподстановок должны быть заданы соответствующие макроопределения. Директива #define позволяет задать макроопределения.