2014-01-08 34 views
9

的端部這是一個關於C99/C11問題他們的嵌入式換行符(可以是C++太)的預處理器和它們的標準遵守。預處理多行註釋和在文件

讓我們考慮兩個源文件:

/* I'm 
* multiline 
* comment 
*/ 

/* I'm 
* multiline 
* comment 
*/ 
i_am_a_token; 

如果我們用進行預處理GCC或鐺(幾個版本進行了測試)兩個文件,就會有差異。在第一種情況下,預處理器不會保留多行註釋中的換行符。在第二種情況下,所有換行符都將保留。

所有提及的標準說(地方里面的「平移階段」):

每個註釋都被一個空格字符替代。換行符保留。

爲什麼在處理文件末尾的多行註釋時存在差異?這種行爲是否符合標準?

回答

6

原因很簡單 - 行號和錯誤報告。由於編譯器用行號報告錯誤,因此預處理文件中的行號對應於原始文件中的行號是很方便的。這就是當註釋被代碼所保留時,註釋佔據的行被保留下來的原因,而不必在文件末尾保留註釋。

至於標準。該標準

指定語言,預處理宏等,但他們指定如何的語言應該被處理。你可以看到它在C11的範圍定義:

ISO/IEC 9899:2011不指定

  • 由C程序轉化爲一個數據處理系統使用的機制;

這意味着預處理器輸出是相當多的內部問題,超出標準範圍。

+0

原因聽起來不錯,但它是否允許標準或強制? – osgx

+0

@osgx好問題 - 更新了答案。 – TMS

+1

@osgx我同意@Tomas關於保留換行符的意圖。儘管如此,保留它們似乎只是一種可能的實現技術(丟棄它們併發出'#行'也應該起作用),所以我傾向於將其視爲標準的問題 - 它應該已經指定了效果(行號不變) ,而不是實施。 – Chris