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

Стадии препроцессорной обработки.

Стадии препроцессорной обработки. Препроцессорная обработка включает несколько стадий, выполняемых последовательно. Конкретная реализация может объединять несколько стадий, но результат должен быть таким, как если бы они выполнялись в следующем порядке:

• все системно-зависимые обозначения (например, системнозависимый индикатор конца строки) перекодируются в стандартные коды;

• каждая пара из символов '\' и "конец строки" вместе с пробелами между ними убираются, и тем самым следующая строка исходного текста присоединяется к строке, в которой находилась эта пара символов;

• в тексте (точнее, в тексте каждой отдельной строки) распознаются директивы и лексемы препроцессора, а каждый комментарий заменяется одним символом пустого промежутка;

• выполняются директивы препроцессора и производятся макроподстановки;

• эскейп-последовательности в символьных константах и символьных строках, например '\n' или '\xF2', заменяются на их эквиваленты (на соответствующие числовые коды);

• смежные символьные строки (строковые константы) конкатенируются, т.е. соединяются в одну строку;

• каждая препроцессорная лексема преобразуется в лексему языка Си.

Поясним, что понимается под препроцессорными лексемами или лексемами препроцессора (preprocessing token). К ним относятся символьные константы, имена включаемых файлов, идентификаторы, знаки операций, препроцессорные числа, знак препинания, строковые константы (строки) и любые символы, отличные от пробела. Можно сказать, что к лексемам препроцессора относятся лексемы языка Си, имена файлов и символы, не определенные иным способом.

Знакомство с перечисленными стадиями препроцессорной обработки объясняет, как реализуются некоторые правила синтаксиса языка. Например, становится понятным смысл утверждений: "каждая символьная строка может быть перенесена в файле на следующую строку, если использовать символ '\'", или "две символьные строки, записанные рядом, воспринимаются как одна строка". Отметим, что после "склеивания" строк в соответствии с приведенными правилами каждая полученная строка обрабатывается препроцессором отдельно.

Рассмотрим подробно стадию обработки директив препроцессора. При ее выполнении возможны следующие действия:

• замена идентификаторов (обозначений) заранее подготовленными последовательностями символов;

• включение в программу текстов из указанных файлов;

• исключение из программы отдельных частей ее текста (условная компиляция);

• макроподстановка, т.е. замена обозначения параметризованным текстом, формируемым препроцессором с учетом конкретных параметров (аргументов).