2012-01-19 49 views
2

我今天在玩flex和野牛,還有一種令人毛骨悚然的事情引起了我的注意。gcc如何知道源代碼的來源?

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’ 

我只過去了C.C lex.yy.c中,和y.tab.c的(c.h和y.tab.h也包括在頭),但不知何故,GCC知道c.l和焯賢事實上,即使我刪除了c.l和c.y,gcc也知道c.y中代碼中的錯誤是在哪裏。它是如何做到的?

我覺得我已經看到過一些我過去用過的不同工具的相似之處,但我不能確切地記得它們是什麼。

+0

你應該總是將'-Wall'傳遞給你的GCC編譯器,並且改進你的代碼,直到你沒有更多的警告。 –

回答

3

你會發現在你的文件中一些標記線沿線的:

#line 75 "c.y" 

這是用來出於這樣的目的,報告錯誤消息或警告對所產生的的文件的能力您正在編譯的實際文件。

這基本上是這樣,你不必去c.c文件,並試圖找出c.y文件,你必須修復的等效線。

從這個意義上講,C文件與對象文件沒有區別。你不需要護理因爲它是自動生成的。如果出現問題,您希望能夠直接回到c.y的正確行,並在源處修復它。

2

生成的C文件具有一些line control preprocessor directives(也產生)等

,然後編譯器認爲這指示的下一行是在文件c.y在線119和計算相應下述位置。