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-14.2.0/cpp/Line-Control.html