3 回答
TA貢獻1801條經驗 獲得超8個贊
主要原因是接口與實現分離。頭文件聲明“什么”類(或任何正在實現的)將做什么,而CPP文件定義“如何”它將執行這些特性。
這減少了依賴關系,這樣使用標頭的代碼就不一定需要知道實現的所有細節,以及只需要知道實現所需的任何其他類/頭。這將減少編譯時間,以及在實現中的某些內容發生變化時所需的重新編譯量。
這并不完美,你通常會求助于一些技巧,比如PIMPL成語正確地分離接口和實現,但這是一個很好的開始。
TA貢獻2065條經驗 獲得超14個贊
C+編譯
第一種方法是將“源文件”文本文件編譯成二進制“對象”文件:CPP文件是已編譯的文件,編譯時不知道其他CPP文件(甚至庫),除非通過原始聲明或頭包含將文件提供給它。CPP文件通常被編譯成.obj或.o“Object”文件。 第二種方法是將所有“對象”文件鏈接在一起,從而創建最終的二進制文件(庫或可執行文件)。
一個可憐的孤獨的CPP文件.。
// A.CPPvoid doSomething(){
doSomethingElse(); // Defined in B.CPP}// B.CPPvoid doSomethingElse(){
// Etc.}// A.CPPvoid doSomethingElse() ; // From B.CPPvoid doSomething(){
doSomethingElse() ; // Defined in B.CPP}復制/粘貼警報!
// B.HPP (here, we decided to declare every symbol defined in B.CPP)void doSomethingElse() ;// A.CPP#include "B.HPP"void doSomething(){
doSomethingElse() ; // Defined in B.CPP}// B.CPP#include "B.HPP"void doSomethingElse(){
// Etc.}// C.CPP#include "B.HPP"void doSomethingAgain(){
doSomethingElse() ; // Defined in B.CPP}如何 include工作?
// A.HPPvoid someFunction();void someOtherFunction();
// B.CPP#include "A.HPP"void doSomething(){
// Etc.}// B.CPPvoid someFunction();void someOtherFunction();void doSomething(){
// Etc.}一件小事-為什么在B.CPP中包括B.HPP?
doSomethingElsedoSomethingElse
結語
#ifndef B_HPP_#define B_HPP_// The declarations in the B.hpp file#endif // B_HPP_
TA貢獻1858條經驗 獲得超8個贊
- 3 回答
- 0 關注
- 769 瀏覽
添加回答
舉報
