Обычно он используется инструментами автоматической генерации кода (например, yacc
или bison
) для установки номера строки в значение строки в реальном исходном файле, а не в C
исходном файле.
Таким образом, когда вы получаете сообщение об ошибке:
a += xyz;
^ No such identifier 'xyz' on line 15 of foo.y
Вы можете посмотреть на строку 15 исходного файла, чтобы увидеть проблему.
В противном случае он говорит что-то смешное, например No such identifier 'xyz' on line 1723 of foo.c
, и вам нужно вручную сопоставить эту строку в автоматически сгенерированном файле C
с эквивалентом в вашем реальном файле. Поверьте мне, если вы не хотите быть глубоко вовлеченным во внутренние механизмы лексического и семантического анализа (или если вы хотите кровоизлияние в мозг), вы не хотите проходить через код, сгенерированный yacc
(bison
может генерировать более хороший код Я не знаю, но меня это не волнует, так как я пишу код более высокого уровня).
Имеет две формы согласно стандарту C99:
#line 12345
#line 12345 "foo.y"
Первый устанавливает только номер строки сообщения, второй также изменяет имя файла сообщения, поэтому вы можете получить ошибку в строке 27, равную foo.y
вместо foo.c
.
Что касается того, что "программист вставил это просто ради радости лжи компилятору", нет. Мы можем быть согнуты и искривлены, но мы обычно не злы :-) Эта строка была помещена туда yacc
или bison
сама, чтобы сделать вам одолжение.