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

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

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

Spec-Zone.ru

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