Spec-Zone.ru › GCC 10 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-10.5.0/cpp/The-preprocessing-language.html

Spec-Zone.ru

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