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

Spec-Zone.ru

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