Как gcc узнает, откуда исходит источник? - PullRequest
2 голосов
/ 19 января 2012

Сегодня я играл с flex и bison, и что-то вроде жуткого внимания привлекло мое внимание.

localhost:c math4tots$ lex c.l
localhost:c math4tots$ yacc -d c.y
localhost:c math4tots$ rm c.l c.y
localhost:c math4tots$ gcc c.c lex.yy.c y.tab.c
c.y: In function ‘opr’:
c.y:120: error: ‘nodeType’ has no member named ‘oper’

Я только прошел cc lex.yy.c и y.tab.c (ch и y.tab.h также включены как заголовки), но gcc каким-то образом знает о cl и cy. Фактически, даже после того, как я удалил cl и cy, gcc знает, где в cy была ошибка в коде.Как это происходит?

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

Ответы [ 2 ]

3 голосов
/ 19 января 2012

Вы найдете несколько маркеров в своих файлах в следующих строках:

#line 75 "c.y"

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

По сути, вам не нужно переходить к файлу c.c и пытаться найти эквивалентную строку в файле c.y, котораяВы должны исправить.

В этом смысле файл C ничем не отличается от объектного файла.Вам не нужно заботиться о том, что в нем, поскольку оно генерируется автоматически.Если с этим возникнет проблема, вы захотите вернуться к правильной строке в c.y и исправить ее у источника.

2 голосов
/ 19 января 2012

Сгенерированный файл C имеет некоторые директивы препроцессора управления строкой (также сгенерированные), такие как

 #line 119 "c.y"

, а затем компилятор считает, что следующая строка после этой директивы находится в файле c.y в строке 119 и соответственно вычисляет следующие позиции.

...