2010-11-15 145 views
0

我加入這個在我的代碼:預處理器基於C

#ifdef DEBUG_MODE 
    printf("i=%d\n",i); 
    fflush(stdout); 
#endif 

,我的問題是,如果我在DEBUG_MODE什麼編譯器在編譯時,這不我不?

回答

3

編譯器不會執行任何操作,因爲沒有定義DEBUG_MODE時沒有任何內容。

+0

謝謝,這就是我認爲 – SnapDragon 2010-11-15 10:25:22

1

如果DEBUG_MODE沒有定義,它下面的代碼將不會被編譯。

2

#ifdef#endif控制條件編譯。這發生在程序的最初傳遞過程中,在編譯器甚至開始考慮文件專門包含C代碼之前進行啞文本替換。在這種情況下,如果沒有定義符號,只留下空白。如果預處理程序定義的測試未在此處定義,則文本甚至不會鬆動到C標記中。

你可以親自看到這一點:只要調用你的編譯器,用它在預處理後用來停止的任何標誌 - 例如, gcc -E x.cc - 在這一點上,輸出中只會有一兩個空行。這也是理解宏的一個非常重要的技術,當你無法猜測爲什麼一些程序不能按照你期望的方式工作時,這是一件很好的事情 - 編譯器說某些類或函數不存在,並且你已經包含了它的頭文件 - 查看預處理後的輸出,以瞭解你的編譯器真正處理的是什麼。

+0

謝謝,我學到了一些新的東西:) – SnapDragon 2010-11-15 10:27:13

+0

輸入被轉換成令牌流,即使是未編譯的部分。參見ISO/IEC 9899:2011§5.1.1.2翻譯階段,其中階段3是「源文件被分解爲預處理令牌」,階段4是「預處理指令被執行」。將源文件分析爲預處理標記後,邏輯上會進行預處理。但最終的結果大致相同。 – 2016-03-02 09:54:34