我加入這個在我的代碼:預處理器基於C
#ifdef DEBUG_MODE
printf("i=%d\n",i);
fflush(stdout);
#endif
,我的問題是,如果我在DEBUG_MODE
什麼編譯器在編譯時,這不我不?
我加入這個在我的代碼:預處理器基於C
#ifdef DEBUG_MODE
printf("i=%d\n",i);
fflush(stdout);
#endif
,我的問題是,如果我在DEBUG_MODE
什麼編譯器在編譯時,這不我不?
編譯器不會執行任何操作,因爲沒有定義DEBUG_MODE時沒有任何內容。
如果DEBUG_MODE
沒有定義,它下面的代碼將不會被編譯。
#ifdef
和#endif
控制條件編譯。這發生在程序的最初傳遞過程中,在編譯器甚至開始考慮文件專門包含C代碼之前進行啞文本替換。在這種情況下,如果沒有定義符號,只留下空白。如果預處理程序定義的測試未在此處定義,則文本甚至不會鬆動到C標記中。
你可以親自看到這一點:只要調用你的編譯器,用它在預處理後用來停止的任何標誌 - 例如, gcc -E x.cc
- 在這一點上,輸出中只會有一兩個空行。這也是理解宏的一個非常重要的技術,當你無法猜測爲什麼一些程序不能按照你期望的方式工作時,這是一件很好的事情 - 編譯器說某些類或函數不存在,並且你已經包含了它的頭文件 - 查看預處理後的輸出,以瞭解你的編譯器真正處理的是什麼。
謝謝,我學到了一些新的東西:) – SnapDragon 2010-11-15 10:27:13
輸入被轉換成令牌流,即使是未編譯的部分。參見ISO/IEC 9899:2011§5.1.1.2翻譯階段,其中階段3是「源文件被分解爲預處理令牌」,階段4是「預處理指令被執行」。將源文件分析爲預處理標記後,邏輯上會進行預處理。但最終的結果大致相同。 – 2016-03-02 09:54:34
謝謝,這就是我認爲 – SnapDragon 2010-11-15 10:25:22