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

Spec-Zone.ru

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