Spec-Zone.ru › GCC 11 CPP

Далее: Традиционные макросы, Наверх: Традиционный режим [Содержание][Индекс]

10.1 Традиционный лексический анализ ¶

Традиционный препроцессор не разбивает свой входной поток на токены так же, как это делает препроцессор, соответствующий стандарту. Входной поток просто обрабатывается как поток текста с минимальной внутренней структурой.

Эта реализация не обрабатывает триграфы (см. триграфы) специально, так как они были изобретены комитетом по стандартам. Она корректно обрабатывает произвольно расположенные экранированные символы новой строки и склеивает строки так, как ожидается; многие традиционные препроцессоры этого не делали.

Формат горизонтальных пробелов в входном файле сохраняется в выходном. В частности, жёсткие табуляции остаются жёсткими табуляциями. Это может быть полезно, например, при предварительной обработке Makefile.

Традиционный CPP распознаёт только комментарии в стиле C и рассматривает последовательность «/*» как начало комментария только если она находится вне строковых литералов. Строковые литералы начинаются с обычных одинарных и двойных кавычек, а также с начального «<» в #include директиве.

Традиционно, комментарии полностью удаляются и не заменяются пробелами. Поскольку традиционный компилятор выполняет свою токенизацию выходного потока препроцессора, это означает, что комментарии могут эффективно использоваться как операторы склейки токенов. Однако комментарии ведут себя как разделители для текста, обрабатываемого самим препроцессором, поскольку он не перекомпилирует свой вход. Например, в

#if foo/**/bar

«foo» и «bar» являются отдельными идентификаторами и расширяются по отдельности, если они являются макросами. Другими словами, эта директива эквивалентна

#if foo bar

а не

#if foobar

В общем случае, в традиционном режиме открывающая кавычка не обязательно должна иметь соответствующую закрывающую кавычку. В частности, макрос может быть определён с текстом подстановки, содержащим непарную кавычку. Конечно, если вы попытаетесь скомпилировать предварительно обработанный вывод, содержащий непарную кавычку, вы получите ошибку синтаксиса.

Однако все директивы предварительной обработки, кроме #define, требуют парных кавычек. Например:

#define m This macro's fine and has an unmatched quote
"/* This is not a comment.  */
/* This is a comment.  The following #include directive
   is ill-formed.  */
#include <stdio.h

Также, как и для ISO препроцессора, закрывающую кавычку можно экранировать обратным слэшем, чтобы предотвратить закрытие строкового литерала.

Далее: Традиционные макросы, Наверх: Традиционный режим [Содержание][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-11.4.0/cpp/Traditional-lexical-analysis.html

Spec-Zone.ru

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