Spec-Zone.ru › GCC 13 CPP

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

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

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

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

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

# linenum filename flags

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

После имени файла может быть ноль или более флагов, которые представляют собой ‘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-13.3.0/cpp/Preprocessor-Output.html

Spec-Zone.ru

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