Препроцессорная обработка включает несколько последовательно выполняемых стадий (конкретная реализация может объединять несколько стадий в одну):
1. все системно-зависимые обозначения (например, индикатор конца строки) перекодируются в стандартные коды,
2. каждая пара из символов ‘\’ и “конец строки” вместе с пробелами между ними убираются, и тем самым соседние строки конкатенируются, т.е. соединяются в одну строку (далее каждая полученная таким образом строка обрабатывается препроцессором отдельно),
3. в каждой строке распознаются директивы и лексемы препроцессора, а каждый комментарий заменяется одним символом пустого промежутка,
4. выполняются директивы препроцессора и производятся макроподстановки,
5. escape-последовательности в символьных константах и строках (например ‘\n’ или ‘\xF2’'), заменяются соответствующими числовыми кодами,
6. смежные символьные константы и строки конкатенируются,
7. каждая препроцессорная лексема преобразуется в текст на языке С++.
К препроцессорным лексемам (лексемам препроцессора, preprocessing token) относятся
· символьные константы,
· строковые константы,
· имена заголовочных файлов,
· идентификаторы,
· знаки операций,
· препроцессорные числа,
· знаки препинания,
· другие символы, отличные от пробела.
На стадии обработки директив препроцессора в зависимости от типа директивы могут выполняться следующие действия:
· замена идентификаторов определенной последовательностью символов,
· включение в программу текстов из заголовочных файлов,
· исключение из программы отдельных частей ее текста (условная компиляция),
· макроподстановка, т.е. замена обозначения параметризованным текстом, формируемым препроцессором с учетом конкретных параметров.