為什麼一般要用#include「xxx.h」?

比如寫一個 1.h 1.cpp, 分別包含了1個類的聲明和實現。 再在main.cpp中使寫個main函數用這個類, 如果在main.cpp里寫include"1.h"好像不能直接編譯main.cpp,但直接寫include"1.cpp"就直接編譯出來,既然這麼方便為何還要用include"1.h"+鏈接器搞這麼麻煩?


C/C++ 採用的是「單元編譯」方式。也就是說編譯器一次只能看到一個源文件,生成的目標文件再由 linker 連接。這樣的好處是,如果一個源文件被修改,需要的時間僅僅是重新編譯這一個文件,和重新連接的時間。就是為了節省時間。「單元編譯」還有一個優勢,源文件之間的依賴完全由 linker 和源文件之間的「約定(下文說明)」來解決,而源文件之間是完全沒有任何依賴的。所以 C/C++ 的編譯階段是可以完全並行化的。

但是每個源文件需要遵守一定的約定,最後的 link 才能成功。比如說,function 聲明必須一樣。為了讓這些約定的東西不用在每一個源文件中重複,就把他們 refactor 出來作為 .h。

簡言之,就是為了節省時間。如果 #include .cpp,不是不能做成項目。但是最後的項目修改任何一行都要重新編譯所有代碼。


給你.h文件,給你.lib文件,不想給你看.cpp源文件,就這麼簡單。


1.cpp和main.cpp需要一起編譯鏈接。

或者1.cpp和main.cpp分別編譯成目標文件再鏈接到一起。

好處是1.cpp和main.cpp可以分別編譯成目標文件,以後其中一個文件改了以後只需要編譯改的那個文件再一起鏈接就可以了。

如果1.cpp和main.cpp在現在和將來都很小,不需要節省這種編譯時間,那完全可以把2個文件合為一個。


「如果在main.cpp里寫include"1.h"好像不能直接編譯」

你應該先弄清楚不能編譯的原因,而不是用錯誤的方法對付過去編譯器然後問原來的方法有什麼存在意義


遇到類似問題,比如: 在vim下如何一鍵編譯運行出結果?

頭文件的定義在源文件裡面.


推薦閱讀:

模塊相比於 #include 指令的優點是什麼?
C++為什麼允許s1+s2="D";這種語句?
什麼時候應當依靠返回值優化(RVO)?
認真學完 C++ Primer 後,C++ 語言到了什麼水平?

TAG:C編程語言 | C | 編譯器 | 編譯 |