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

Spec-Zone.ru

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