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

Spec-Zone.ru

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