2010-01-05 76 views
4
/* 
#define FOO 
*/ 

#ifdef FOO 
#define BAR "pirate" 
#else 
#define BAR "ninja" 
#endif 

int main() { printf(BAR); getchar(); } 

在此代碼中未定義FOO(Visual Studio 2008)。我假設評論首先被處理,然後是預處理器,然後是代碼。預處理器之前是否處理了註釋?這是標準的一部分嗎?評論總是在預處理器之前處理?

回答

9

我假設先處理註釋,然後是預處理器,然後是代碼。預處理器之前是否處理了註釋?

排序 - 預處理器作業的一部分刪除註釋。在這種情況下,它並不在意你在評論中有指示;它仍然像其他評論一樣被刪除。

2

是的(在每一個理智的宇宙中)。

3

一些快速研究表明註釋轉換爲空白預處理器。所以,這都是同一流程的一部分。

根據Wikipedia,註釋在預處理器指令之前處理。

4

是的,從語言標準的角度來看,預處理器開始工作之前,處理註釋(用空格替換)

在實際實現中,註釋處理可以由一個處理預處理指令,並執行宏替換相同的代碼(例如,相同的可執行文件)來進行,但結果必須是相同的:評價對預處理適當沒有影響。

在老年人和/或非標準的代碼,有時一個可能會看到一些技巧,依賴於涉及具體實現的評論與預處理的關係,等等,例如,評論創建使用預處理指令不規範的行爲

#define CONCAT(a, b) a##b 
#define BEGIN_COMMENT CONCAT(/, *) 
#define END_COMMENT CONCAT(*, /) 

BEGIN_COMMENT 
    This code is supposedly commented-out 
END_COMMENT 

或使用預處理級級聯的意見(C編譯器是不支持的宏定義##運營商)這樣的招數

#define OLD_CONCAT(a, b) a/**/b 

都不是在standa法律C.他們都沒有真正的工作。

10

根據C標準,在程序的翻譯(編譯)期間有8個翻譯階段。每個註釋在翻譯階段3中被空白字符替代,而預處理指令在階段4中被執行。

7

是的,預處理器在處理指令之前替換註釋。

從節5.1.1.2 C99標準(翻譯相):

3)源文件被分解成預處理標記和空白字符(包括註釋序列)....每個註釋被一個空格字符替換....

4)預處理指令被執行,宏調用被擴展,....