Spec-Zone.ru › GCC 13 CPP

6 Управление Строками

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

Если вы пишете программу, которая генерирует исходный код, например, генератор парсеров bison, вы можете вручную скорректировать представление препроцессора текущего имени файла и номера строки. Части выходных данных bison генерируются с нуля, другие части получены из стандартного файла парсера. Остальные скопированы дословно из входных данных bison. Вам нужно, чтобы сообщения об ошибках компилятора и символьные отладчики могли ссылаться на входной файл bison.

Программа bison или любая подобная программа может организовать это, записав в выходной файл директивы ‘#line’. ‘#line’ — это директива, которая задаёт исходный номер строки и имя исходного файла для последующего ввода в текущий файл входных данных препроцессора. У ‘#line’ есть три варианта:

#line linenum

linenum — это положительное целочисленное десятичное значение. Оно определяет номер строки, который должен отображаться для следующей строки ввода. Последующие строки считаются с linenum.

#line linenum filename

linenum — такое же, как и в первом варианте, и оказывает такое же влияние. Кроме того, filename — это строковая константа. Следующая строка и все последующие строки отображаются как происходящие из указанного файла, до тех пор, пока что-либо не изменит это. filename интерпретируется в соответствии с обычными правилами для строковой константы: обратные слэши интерпретируются. Это отличается от ‘#include’.

#line anything else

anything else проверяется на предмет макровызовов, которые разворачиваются. Результат должен соответствовать одному из двух вышеперечисленных вариантов.

Директивы ‘#line’ изменяют результаты предопределённых макросов __FILE__ и __LINE__ с этого момента. См. Стандартные предопределённые макросы. Они не оказывают никакого влияния на представление ‘#include’ о директории, содержащей текущий файл.

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

Spec-Zone.ru

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