Spec-Zone.ru › GCC 5 CPP

9 Вывод препроцессора

При использовании C-препроцессора с компиляторами C, C++ или Objective-C, он интегрирован в компилятор и передает поток бинарных токенов непосредственно парсеру компилятора. Однако он также может использоваться в более традиционном режиме автономной работы, где он генерирует текстовый вывод.

Вывод C-препроцессора выглядит очень похоже на входной, за исключением того, что все строки директив препроцессинга заменены пустыми строками, а все комментарии — пробелами. Длинные серии пустых строк отбрасываются.

Стандарт ISO определяет, что реализация определяет, сохраняет ли препроцессор пробелы между токенами или заменяет их, например, одним пробелом. В GNU CPP пробелы между токенами сводятся к одному пробелу, за исключением того, что первый токен в строке, не являющейся директивой, предваряется достаточным количеством пробелов, чтобы он отображался в том же столбце в выводе препроцессинга, что и в исходном исходном файле. Это делается для того, чтобы вывод был легко читаемым. См. Различия с предыдущими версиями.

Информация об имени файла и номере строки передается строками вида

# linenum filename flags

Они называются маркерами строк. Они вставляются по мере необходимости в вывод (но никогда не внутри строки или символьного константы). Они означают, что следующая строка происходит из файла filename на строке linenum. filename никогда не будет содержать непечатаемых символов; они заменяются восьмеричными escape-последовательностями.

После имени файла следует ноль или более флагов, которые являются ‘1’, ‘2’, ‘3’ или ‘4’. Если есть несколько флагов, их разделяют пробелы. Вот что означают флаги:

‘1’

Это указывает на начало нового файла.

‘2’

Это указывает на возврат к файлу (после включения другого файла).

‘3’

Это указывает, что следующий текст происходит из системного заголовочного файла, поэтому некоторые предупреждения следует подавлять.

‘4’

Это указывает, что следующий текст следует рассматривать как заключенный в неявный блок extern "C".

В качестве расширения препроцессор принимает маркеры строк в файлах ввода, не являющихся ассемблерными. Они обрабатываются как соответствующая директива ‘#line’ (см. Управление строками), за исключением того, что разрешены флаговые дополнения, которые интерпретируются с описанными выше значениями. Если задано несколько флагов, они должны быть в порядке возрастания.

Некоторые директивы могут дублироваться в выводе препроцессора. Это ‘#ident’ (всегда), ‘#pragma’ (только если сам препроцессор не обрабатывает pragma), и ‘#define’ и ‘#undef’ (с определенными опциями отладки). Если это произойдет, ‘#’ директивы всегда будет в первом столбце, и пробела между ‘#’ и именем директивы не будет. Если макрорасширение генерирует токены, которые могут быть ошибочно приняты за дублированную директиву, пробел будет вставлен между ‘#’ и именем директивы.

Далее: Традиционный режим, Предыдущее: Другие директивы, Вверх: В начало [Содержание][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-5.5.0/cpp/Preprocessor-Output.html

Spec-Zone.ru

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