Spec-Zone.ru › GCC 13 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-13.3.0/cpp/Traditional-lexical-analysis.html

Spec-Zone.ru

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