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любое другое значение проверяется на наличие вызовов макросов, которые расширяются. Результат должен соответствовать одному из двух вышеперечисленных вариантов.
Директивы «#line» изменяют результаты предопределенных макросов __FILE__ и __LINE__ с этого момента. Смотрите Стандартные предопределенные макросы. Они не влияют на представление директивы «#include» о каталоге, содержащем текущий файл.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-11.4.0/cpp/Line-Control.html