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-12.1.0/cpp/Preprocessor-Output.html