一般在.h文件中都會看到
#ifndef FILE_H
#define FILE_H
/* ... Declarations etc here ... */
#endif
那麼爲什麼要在.h文件中這麼聲明呢?
這是一種防止頭文件被多次包含的預處理技術,由於各種原因可能是有問題的。在編譯項目時,編譯每個.cpp文件(通常)。簡單來說,這意味着編譯器會把你的.cpp文件,打開任何文件#included
,將它們全部連接成一個海量文本文件,然後執行語法分析,最後將它轉換成一些中間代碼,優化/執行其他任務,最後生成目標架構的彙編輸出。因此,如果#included
一個.cpp文件下的文件多次,則編譯器將附加文件內容兩次,因此如果該文件中有定義,你會收到一個編譯器錯誤,告訴你重新定義了一個變量。FILE_H
當編譯過程中的預處理器步驟處理文件時,首次到達其內容時,前兩行將檢查是否已爲預處理器定義。如果沒有,它將定義FILE_H
並繼續處理它和指令之間的代碼#endif
。下一次該文件的內容被預處理器看到時,檢查FILE_H
將是假的,所以它將立即掃描#endif
並繼續。這樣可以防止重新定義錯誤。它將定義並繼續處理它和指令之間的代碼。