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-14.2.0/cpp/The-preprocessing-language.html