c++在新建一个类时,会新建一个a.h文件和a.cpp文件,a.cpp的第一句是#include “a.h”。那么我想问:1.我在另外一个类,类b中使用类a的时候,只需包含它的头文件#include “a.h”,那这时是不是只把a.h中的类声明代码包含在了类b文件中,还是说把类a的声明代码和实现代码都包含了?2.不管是哪种包含,预处理程序会把相应代码插入到对应的文件中,在编译时,编译器是把每一个cpp文件分开作为一个单元来编译,还是直接对一个文件里面所有的类进行编译
走同样的路,发现不同的人生
1:只把a.h中的類別宣告程式碼包含在了類別b檔中程式在編譯完成後,將編譯的所以檔案連結成一個可以執行檔,相當於把所有程式碼匯總所以只要包含宣告就行了2:每一個cpp單獨編譯如果不同cpp有聯繫,例如a.cpp 呼叫b.cpp中的函數,b.cpp改變以後,只會編譯b.cpp和b.cpp產生聯繫的cpp
包含的是 a.h 裡的內容,如果 a.h 裡面有實現,那就有實現。
編譯的具體動作以 linux 為例,可以用cc -E a.cpp來看預處理之後的結果,每個 .cpp 檔案會被視為一個編譯單元並生編譯產生 .o 檔案。
cc -E a.cpp
1:包含頭檔.h時, 僅僅將該頭檔中的程式碼包含進來,不會把與之對應的.cpp包含進來。 所以一般在.h裡面只提供變數或函數的聲明, 而不提供實作程式碼。 否則當一個頭文件被多個.cpp包含時, 連結時就會報告變數或函數重複定義;2:每個cpp會單獨編譯成對應的.o文件, 然後再被連結到一起形成可執行檔或函式庫;
1:只把a.h中的類別宣告程式碼包含在了類別b檔中
程式在編譯完成後,將編譯的所以檔案連結成一個可以執行檔,相當於把所有程式碼匯總
所以只要包含宣告就行了
2:每一個cpp單獨編譯
如果不同cpp有聯繫,例如a.cpp 呼叫b.cpp中的函數,b.cpp改變以後,只會編譯b.cpp和b.cpp產生聯繫的cpp
包含的是 a.h 裡的內容,如果 a.h 裡面有實現,那就有實現。
編譯的具體動作以 linux 為例,可以用
cc -E a.cpp
來看預處理之後的結果,每個 .cpp 檔案會被視為一個編譯單元並生編譯產生 .o 檔案。1:包含頭檔.h時, 僅僅將該頭檔中的程式碼包含進來,不會把與之對應的.cpp包含進來。
所以一般在.h裡面只提供變數或函數的聲明, 而不提供實作程式碼。 否則當一個頭文件被多個.cpp包含時, 連結時就會報告變數或函數重複定義;
2:每個cpp會單獨編譯成對應的.o文件, 然後再被連結到一起形成可執行檔或函式庫;