6 Управление строками ¶
Препроцессор C сообщает компилятору C о местоположении каждого токена в исходном коде. В настоящее время это просто имя файла и номер строки. Все токены, полученные в результате расширения макросов, сообщаются как появившиеся в строке исходного файла, где был использован внешний макрос. В будущем мы намерены обеспечить большую точность.
Если вы пишете программу, которая генерирует исходный код, например, bison генератор парсеров, вы можете вручную настроить представление препроцессором текущего имени файла и номера строки. Части вывода от bison генерируются с нуля, другие части берутся из стандартного файла парсера. Остальные части копируются дословно из входных данных bison. Вы хотите, чтобы сообщения об ошибках компилятора и символьные отладчики могли ссылаться на входной файл bison.
bison или любая подобная программа может организовать это, записав директивы «#line» в выходной файл. «#line» — это директива, которая задает исходный номер строки и имя файла для последующего ввода в текущем файле ввода препроцессора. «#line» имеет три варианта:
#line linenum-
linenum — это положительная десятичная целочисленная константа. Она задаёт номер строки, который должен быть показан для следующей строки ввода. Последующие строки считаются с linenum.
#line linenum filename-
linenum — это то же самое, что и в первом варианте, и имеет тот же эффект. Кроме того, filename — это строковая константа. Следующая строка и все последующие строки будут отображаться как взятые из указанного файла, пока что-то не изменит это. filename интерпретируется по стандартным правилам для строковых констант: обратные косые черты интерпретируются. Это отличается от «#include».
#line anything elseanything else проверяется на вызовы макросов, которые расширяются. Результат должен соответствовать одному из двух вышеперечисленных вариантов.
Директивы «#line» изменяют результаты предопределённых макросов __FILE__ и __LINE__ начиная с этого момента. См. Стандартные предопределённые макросы. Они не влияют на представление директивы «#include» о директории, содержащей текущий файл.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-10.5.0/cpp/Line-Control.html