Spec-Zone.ru › GCC 13 CPP

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API