/*
#define FOO
*/
#ifdef FOO
#define BAR "pirate"
#else
#define BAR "ninja"
#endif
int main() { printf(BAR); getchar(); }
在此代碼中未定義FOO(Visual Studio 2008)。我假設評論首先被處理,然後是預處理器,然後是代碼。預處理器之前是否處理了註釋?這是標準的一部分嗎?評論總是在預處理器之前處理?
/*
#define FOO
*/
#ifdef FOO
#define BAR "pirate"
#else
#define BAR "ninja"
#endif
int main() { printf(BAR); getchar(); }
在此代碼中未定義FOO(Visual Studio 2008)。我假設評論首先被處理,然後是預處理器,然後是代碼。預處理器之前是否處理了註釋?這是標準的一部分嗎?評論總是在預處理器之前處理?
我假設先處理註釋,然後是預處理器,然後是代碼。預處理器之前是否處理了註釋?
排序 - 預處理器作業的一部分是刪除註釋。在這種情況下,它並不在意你在評論中有指示;它仍然像其他評論一樣被刪除。
是的(在每一個理智的宇宙中)。
一些快速研究表明註釋轉換爲空白由預處理器。所以,這都是同一流程的一部分。
根據Wikipedia,註釋在預處理器指令之前處理。
是的,從語言標準的角度來看,預處理器開始工作之前,處理註釋(用空格替換)。
在實際實現中,註釋處理可以由一個處理預處理指令,並執行宏替換相同的代碼(例如,相同的可執行文件)來進行,但結果必須是相同的:評價對預處理適當沒有影響。
在老年人和/或非標準的代碼,有時一個可能會看到一些技巧,依賴於涉及具體實現的評論與預處理的關係,等等,例如,評論創建使用預處理指令不規範的行爲
#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.他們都沒有真正的工作。
根據C標準,在程序的翻譯(編譯)期間有8個翻譯階段。每個註釋在翻譯階段3中被空白字符替代,而預處理指令在階段4中被執行。
是的,預處理器在處理指令之前替換註釋。
從節5.1.1.2 C99標準(翻譯相):
3)源文件被分解成預處理標記和空白字符(包括註釋序列)....每個註釋被一個空格字符替換....
4)預處理指令被執行,宏調用被擴展,....