Spec-Zone.ru › GCC 9 CPP

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

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

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

Стандарт ISO определяет, что реализация определяет, сохраняет ли препроцессор пробелы между токенами или заменяет их, например, одним пробелом. В GNU CPP пробелы между токенами сворачиваются в один пробел, за исключением того, что первый токен в строке без директив предваряется достаточным количеством пробелов, чтобы он отображался в том же столбце в выводе предварительной обработки, что и в исходном исходном файле. Это делается для удобства чтения вывода. 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-9.5.0/cpp/Preprocessor-Output.html

Spec-Zone.ru

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