Что значит #line? - PullRequest
       11

Что значит #line?

12 голосов
/ 06 февраля 2012

Что делает следующая строка?

#line 25 "CSSGrammar.y"

А что с расширением?

Ответы [ 7 ]

12 голосов
/ 06 февраля 2012

В соответствии со стандартом:

§16.4.3:

Директива предварительной обработки вида

# line digit-sequence new-line

приводит к тому, что реализация ведет себя так, как если быСледующая последовательность исходных строк начинается с исходной строки с номером строки, указанным в последовательности цифр (интерпретируется как десятичное целое число).Если последовательность цифр задает ноль или число больше 2147483647, поведение не определено.

§16.4.4:

Директива предварительной обработки вида

# line digit-sequence " s-char-sequenceopt" new-line

аналогичным образом устанавливает предполагаемый номер строки и меняет предполагаемое имя исходного файла на содержимое строкового литерала.

§16.4.5:

Директива предварительной обработки вида

# line pp-tokens new-line

(не совпадающая ни с одной из двух предыдущих форм) разрешена.Токены предварительной обработки после строки в директиве обрабатываются так же, как и в обычном тексте (каждый идентификатор, определенный в настоящее время как имя макроса, заменяется своим списком замены токенов предварительной обработки).Если директива, получающаяся после всех замен, не соответствует ни одной из двух предыдущих форм, поведение не определено;в противном случае результат обрабатывается соответствующим образом.

Расширение .y - это именно то, что автор выбрал для использования, возможно, чтобы показать, что это был файл YACC (слово «грамматика» такжеуказывает на это, хотя это всего лишь предположение).

8 голосов
/ 06 февраля 2012

В нем просто говорится, что текущая строка кода получена из строки 25 CSSGrammar.y, файла грамматики в стиле YACC, в котором этот код был сгенерирован.

Это может использоваться отладчиками для перехода к самой грамматике, а не к сгенерированному коду.

4 голосов
/ 06 февраля 2012
Директива

#line изменяет положение отчета для компилятора и используется программным обеспечением для генерации кода, чтобы помочь программисту идентифицировать проблему в исходном источнике. Любой может использовать его, чтобы помочь перенаправить отчеты об ошибках, чтобы сделать их более информативными.

Так, например, ваш синтаксический анализатор генерирует файл CSSGrammar.cpp, скажем, который компилируется компилятором c ++ и содержит фрагменты кода c ++, директива #line 25 "CSSGrammar.y" указывает компилятору c ++ обрабатывать эту конкретную точку в файле, как если бы это строка № 25 от CSSGrammar.y

Компилятор продолжит анализировать последующие строки и сообщать об ошибках в соответствии с начальными условиями этой директивы.

Таким образом, если ошибка возникнет через 3 строки, она сообщит, что произошла ошибка в строке 28 в CSSGrammar.y

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

Как правило, вы увидите, что на этом пути есть несколько директив #line; они просто существуют для учета различных инъекций по пути (для сброса каретки отчетности, если хотите).

Обратите внимание, что директива #line может использоваться любым генератором, включая ваш собственный, и не ограничивается в любом случае генераторами синтаксического анализатора.

2 голосов
/ 06 февраля 2012

Для компилятора директива полагать, что следующая строка - это строка с номером 25 в файле CSSGrammar.y. Затем, если компилятор обнаружит ошибку во 2-й следующей строке, он будет сообщен как строка 26 из CSSGrammar.y

Программы, генерирующие файлы C, такие как bison, или yacc, или flex, или ANTLR , или даже (устаревшие) MELT Используйте эту возможность много.

Если генерируется отладочная информация (например, с gcc -g), она будет указывать на файл CSSGrammar.y в вашем примере.

2 голосов
/ 06 февраля 2012

Генератор синтаксического анализатора 'yacc' использует файлы с расширением .y и файлы, содержащие c или c ++.Он добавляет эти строки #line, чтобы отладчик мог вернуться к исходному источнику, не принимая замен.

1 голос
/ 06 февраля 2012

это опция препроцессора c. Он говорит c-анализатору сбросить счетчик строк исходного файла, притворившись, что это строка # 25.

С этой информацией вам будет проще отлаживать исходный файл. Файл yacc будет переведен в c-source, где это строка с указанием источника.

0 голосов
/ 14 апреля 2019

Использование #line заставляет компилятор испытывать амнезию в отношении того, какой файл он компилирует и в какую строку он загружает, и загружает новые данные.

Примечание. Компилятор все еще компилируется из той строки, в которой он былвкл.

...