2012-02-05 43 views
8

以下行可以做什麼?#line是什麼意思?

#line 25 "CSSGrammar.y" 

什麼是擴展名?

+0

只是出於好奇...哪個編譯器吃這個? – Vyktor 2012-02-05 20:47:52

+0

@Vyktor我正在使用MSVS2008。 – 2012-02-05 20:48:27

+1

@Vyktor它是標準的一部分 – 2012-02-05 20:48:28

回答

11

根據標準:

§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文件(單詞「語法」也指出,雖然這只是一個猜測)。

2

'yacc'解析器生成器消耗以.y結尾的文件,併發出包含c或C++的文件。它添加了這些#line行以允許調試器回到原來的源代碼,不接受任何替代品。

7

它只是聲明當前代碼行來源於CSSGrammar.y的第25行,這是一個YACC樣式的語法文件,它是生成此代碼的位置。

調試器可以使用這種方式來進入語法本身,而不是生成的代碼。

+2

不僅適用於調試器:它還可以幫助編譯器指出錯誤的正確來源。 – 2012-02-05 20:51:31

1

這是一個c預處理器選項。它告訴c語法分析器刪除它假裝的源文件的行數,即第25行。

有了這些信息,您可以更輕鬆地調試源文件。 yacc文件將被轉換爲c源代碼,這裏是假源代碼行。

1

它是編譯器的一條指令,認爲下面一行是文件CSSGrammar.y中的行號25。然後,如果是通過在第二下一行的編譯器檢測到一個錯誤,這將被報告爲從CSSGrammar.y

程序產生的C文件線26到來,像bison,或者yacc,或flex,或ANTLR,或甚至MELT使用這種可能性很多。

如果生成調試信息(例如使用gcc -g),它將指向示例中的CSSGrammar.y文件。

4

#line指令修改編譯器的報告位置,由代碼生成軟件用來幫助程序員識別原始源中的問題。任何人都可以使用它來幫助重定向錯誤報告以提供更多信息。

因此,舉例來說,你的解析器生成一個CSSGrammar.cpp文件say,它由C++編譯器編譯,並且在其中有C++片段,#line 25 "CSSGrammar.y"指令告訴C++編譯器將該文件中的特定點視爲它是CSSGrammar.y的第25行

編譯器將繼續解析後續行,並在該指令的初始條件下報告錯誤。

因此,如果3行以後發生錯誤,將報告,第28行發生CSSGrammar.y錯誤

注意,單個源文件可以有源從多個部分進來;而且這個指令可以用來很有效地指示錯誤條件。

通常你會看到沿途有多個#line指令;他們只是在那裏解釋一路上的各種注射(如果您願意的話,重置報告插入符號)。

請注意,#line指令可以被包括您自己的任何生成器使用,並且不限於解析器生成器。