1.4 Язык предобработки
После токенизации поток токенов может быть просто передан в парсер компилятора. Однако, если он содержит какие-либо операции на языке предобработки, он будет преобразован в первую очередь. Эта стадия примерно соответствует «фазе перевода 4» стандарта и является тем, о чём большинство людей думают, когда говорят о работе препроцессора.
Язык предобработки состоит из директивах для выполнения и макросов для расширения. Его основные возможности:
- Включение файлов заголовков. Это файлы объявлений, которые могут быть подставлены в вашу программу.
- Расширение макросов. Вы можете определить макросы, которые являются сокращениями для произвольных фрагментов кода C. Препроцессор заменит макросы их определениями по всей программе. Некоторые макросы определены для вас автоматически.
- Условная компиляция. Вы можете включать или исключать части программы в зависимости от различных условий.
- Управление строками. Если вы используете программу для объединения или перестановки исходных файлов в промежуточный файл, который затем компилируется, вы можете использовать управление строками, чтобы сообщить компилятору, откуда каждая исходная строка изначально произошла.
- Диагностика. Вы можете обнаруживать проблемы во время компиляции и выдавать ошибки или предупреждения.
Есть ещё несколько менее полезных функций.
За исключением расширения предопределённых макросов, все эти операции запускаются с помощью директивах предобработки. Директивы предобработки — это строки в вашей программе, которые начинаются с ‘#’. Разрешается пробел до и после ‘#’. За ‘#’ следует идентификатор, имя директивы. Он указывает операцию, которую необходимо выполнить. Директивы обычно записываются как ‘#name’, где name — это имя директивы. Например, ‘#define’ — это директива, которая определяет макрос.
‘#’, который начинает директиву, не может произойти от расширения макроса. Кроме того, имя директивы не расширяется как макрос. Таким образом, если foo определено как макрос, расширяющийся до define, это не делает ‘#foo’ действительной директивой предобработки.
Набор допустимых имён директив фиксирован. Программы не могут определять новые директивы предобработки.
Некоторые директивы требуют аргументов; они составляют остальную часть строки директивы и должны быть разделены от имени директивы пробелами. Например, после ‘#define’ должны следовать имя макроса и предполагаемое расширение макроса.
Одна директива предобработки не может занимать более одной строки. Однако строка может быть продолжена с помощью обратной косой черты и новой строки или с помощью блочного комментария, который простирается за пределы конца строки. В любом случае, когда обрабатывается директива, продолжения уже объединены с первой строкой, чтобы получиться одна длинная строка.
Предыдущая: Токенизация, Далее: Обзор [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-9.5.0/cpp/The-preprocessing-language.html