Стадии и основные команды препроцессорной обработки
Лекция № 9. Препроцессорные средства
Термины
Потоком (stream)называется источник или получатель данных, который можно ассоциировать с диском или другим внешним устройством ввода- вывода.
Препроцессор языка Си представляет собой программу (подпрограмму), которая используется для обработки исходного файла на нулевой фазе компиляции. Чаще всего препроцессор не отдельная программа, а входит в состав компилятора.
Директивы препроцессора представляют инструкции, записанные в исходном тексте программы. Они обычно используются для того, чтобы облегчить модификацию исходных программ и сделать их более независимыми от особенностей различных реализаций компилятора языка Си, разных компьютеров и операционных сред.
Стадии препроцессорной обработки
1. Все системно-зависимые обозначения (например, системно-зависимый индикатор конца строки) перекодируются в стандартные коды.
2. Каждая пара символов «\» и «конец строки» убираются, и тем самым следующая строка присоединяется к исходной.
3. В тексте распознаются директивы препроцессора, а каждый комментарий заменяется пробелом.
4. Выполняются директивы препроцессора и выполняются макроподстановки.
5. ESC-последовательности в строках (символах) заменяются на их эквиваленты (числовые коды).
6. Смежные символьные строки объединяются в одну строку.
С помощью директив препроцессора можно выполнять следующие действия
Кроме того, обычно в данной теме рассматривают и указания компилятору, внешне похожие на директивы препроцессора. Например, в Microsoft Visual C++ существует указание компилятору #pragma.
Директива позволяет заменить некоторый идентификатор в тексте программы на некоторый текст (строку замещения). Формат директивы:
#define <идентификатор> [<текст>]
Директива может располагаться в любом месте обрабатываемого текста, ее действие от точки размещения до конца текста программы (имеется ввиду, что в текущий файл могут включаться и другие файлы, это все составляет исходный текст программы). Директива определяет идентификатор как препроцессорный (это условие можно далее использовать для условной компиляции). В результате обработки вхождения идентификатора заменяются текстом, окончание которого признак конца строки. Символы пробела в начале и конце текста в подстановке не участвуют. Если текст слишком длинный его можно продолжить на другой строке, использую символ «\».
Идентификатор можно переопределять с помощью другого использования #define или отменить его действие с помощью директивы
#undef <идентификатор>
Директива широко используется в стандартных заголовочных файлах. Например, в файле math.h: