2013-03-16 79 views
4

在C++ 11,標準說,在2.2.3:多行註釋和新線

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

  1. 是這句話的順序,這意味着留住新線徵求意見,與新行終止?

  2. 如果(1)爲真,那麼爲什麼Visual C++,gcc和clang爲多註釋中的每一行保留空行。

這個問題很重要,因爲我正在編寫一個C++預處理器。

+0

順便說一下,這對於宏聲明是特別有意義的,因爲它們以(非拼接)「新行」字符結束。 – 2013-03-16 05:14:56

+0

@ K-ballo:即使多行註釋在#define之後開始,並在10行之後結束,然後是宏名稱及其定義,它仍然可以工作並且宏將有效 – 2013-03-16 05:45:31

+0

相關:http://forum.cppgm.org/question/667/new-line-characters-in-c-comments – 2013-03-16 06:46:20

回答

2

它所談論的新行是在評論被單個空格字符替換後仍然存在的新行。當在包含的段落的較大上下文中查看片段時,這是更清楚的。

因此,特別是多行註釋中的新行是而不是保留,並且不會終止預處理指令。

+0

如果那真的那麼你對問題2的回答是什麼? – 2013-03-16 06:15:20

+0

@Muhammadalaa:他們沒有保留標準意義上的意思。發生的事情是,爲了很好地打印預處理程序的輸出,而不是將所有非新行空白與單個空格一樣存儲,它們將其中的一部分保留在其「空白標記」中。然而,從邏輯上講,這對預處理器的功能沒有影響,只是爲了讓'gcc -E'的中間輸出更具人類可讀性。 – 2013-03-16 06:21:11

2

C/C++預處理器會去除所有註釋,但是當您查看預處理器輸出時,通常會將源代碼行保留在相同的行號處。

這樣,讀取預處理器輸出的編譯器可以爲錯誤消息和警告輸出正確的行號。

預處理器通常也保留所有空行。

您還必須嚴格區分從源代碼中刪除的多行宏以及何時擴展。他們總是被刪除,同時保持所有換行。它們總是被取代,所有的換行都被剝離。兩者完全獨立,彼此無關。

在過去,C預處理器會始終在stdout上生成其輸出,C編譯器會從stdin中讀取它。預處理器發出內部的#<N> "<FILE>"語句,C語言編譯器將其解釋爲'行號N在後面'。所以預處理器在理論上可以不輸出空行。但實際上這#<N> "<FILE>"功能僅用於#include語句後面的行。

今天,預處理器已內置到C編譯器中以提高性能,但如果明確請求,仍然可以查看中間結果。

注意:另請參見下面的好評:該標準並未真正指定預處理程序的文本輸出在空白方面的外觀。文本輸出是特定於實現的。有很多解釋的餘地​​。定義的內容是至少有一個空格字符必須在哪裏,並且所有的標記都保留在原始行上(或用原始行標記),以便錯誤消息有意義。

+1

好帖子,但區分標準指定的內容和特定於實現的內容很重要。階段4的標準邏輯輸出是一系列沒有明顯空白的「預處理 - 標記」。您所描述的「文本」輸出格式(例如'gcc -E')不是標準要求或規定的。符合標準的預處理器不需要生成這種格式,即使它具有這種格式,也不足以在預處理器之間進行差異等價處理。在成功理解第16條之前,需要理解這一點。 – 2013-03-25 19:48:34