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