1. 大學學C/C++的時候,大家寫.h檔案的時候,發現有符號這個檔案裡沒有,就會#include相關的頭一下;寫.cpp檔案的時候,發現有符號這個檔案裡沒有也會#include一下,一直沒有出什麼問題。
2. 再晚些知道了#include是先行編譯,就是copy一個檔案的全部內容到當前#include語句的位置而已,而編譯器根本不去編譯.h,以及他裡面到底是啥。
然後隔了很久沒用C/C++做很較複雜的程式,直到今天……封裝整個DirectDrawManager的時候,我SB了。
我想:“反正.h不去編譯,我就把.cpp和.h裡面要用的符號的#include語句都寫在.cpp裡,然後在這些#include的下面來#include 自己.h不就行了麼。這樣會先把相關的標記法宣告都載入進來,然後粘貼上我的.h檔案,那麼編譯時間,也不會出錯,而且這樣我感覺一下子對#include了哪些頭非常清楚,因為都在.cpp裡了,.h裡啥也不#include。”
接著我編譯了上面這種的.cpp檔案,成功,哇好爽!
然後我build整個項目,一共好幾百個錯誤,哇好爽!
SB的我想:“.cpp過了啊,而且沒有未定義與重複定義呀?!難道我記錯了…….h也要檢查不成?!”
於是將所有在.cpp裡#include的語句都放在了自己的.h檔案裡(除了#include "自己.h"),build成功!
哈哈哈,果然是我記錯了!
SB!我從腦後突然傳來一個下意識的聲音~“先行編譯就是先行編譯,怎麼TMD可能去檢查.h!你就是個SB,還美呢!”
為了不被自己的良心譴責,我繼續嘗試修改各種方式,終於,我發現了自己的SB之處,也可以給出了本文標題的答案。
#include就是拷貝一塊檔案進來,在.cpp裡面寫這個類相關的頭的#include,這個.cpp是沒問題了,可關鍵是其他用這個類的檔案,如果#include這個類的標頭檔,但是因為這個類的標頭檔裡沒有引用這個標頭檔相關的其他類的標頭檔,就會在編譯使用者時出現找不到符號的錯誤。
所以在.h裡有依賴性的符號,就應該在.h裡#include的,在.cpp裡有依賴性的符號,就在.cpp裡寫#include。
這樣當#include拷貝一塊檔案過來時,才會將相關依賴的符號也都拷貝進來。
自我檢討完畢!