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