Spec-Zone.ru › GCC 14 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’ (только если препроцессор не обрабатывает пragma сам по себе) и ‘#define’ и ‘#undef’ (с определёнными параметрами отладки). Если это происходит, ‘#’ директивы всегда будет в первом столбце, и между ‘#’ и именем директивы пробела не будет. Если расширение макроса приводит к созданию токенов, которые могут быть ошибочно приняты за дублированную директиву, между ‘#’ и именем директивы будет вставлен пробел.

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

Spec-Zone.ru

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