簡體   English   中英

如果我可以在.h文件中包含所有C ++代碼,為什么要使用.cpp文件?

[英]Why to use .cpp files if I can have all of my C++ code in .h file?

如果我可以在.h文件中包含所有C ++代碼,為什么要使用.cpp文件? 我的意思是.cpp文件是很奇怪的,如果所有代碼都可以在.h文件中寫入? 任何人都可以清潔嗎?

原因如下:

(1)增量構建時間

當項目變大時,管理構建時間是有問題的,特別是對於C ++項目。 在一次微小的改變后建立1或5分鍾會產生很大的不同。 大型項目的大多數變化很小需要大量測試,這一點得到了強調。 再加上TDD和重構的任何嘗試,你是一個用西西里鞋的死slu ..

拆分成標題和正文,並將其移動到庫可以極大地改善增量構建時間。

(2)靜力學
對於很多事情,你需要一個類型的單個實例,即

// .cpp
static Foo foo;

沒有辦法(我知道)允許在僅頭文件項目中使用它。 編譯器特定的解決方案是有限的,例如MSVC中的__declspec(selectany)僅限於POD類型。

[編輯] C ++ 17現在也允許內聯進行變量初始化,因此這不再是阻塞問題。

(3)實施隱藏
.cpp / .h分離是將公共接口與實現細節明確分開的唯一方法。 您可以將類成員引入private部分,但這對其他實體不起作用。 (即使標題/正文分離是泄漏的,除非你添加其他技術,如PIMPL,所以這個論點有點弱IMO,但同樣,在一個大型項目中,我非常懷念這種有效的,如果不完美的方法)。


很棒的問題,無論如何 - 你已經認識到與C / C ++構建模型存在某種沖突,我認為這是一個可怕含義的古老遺物。

您應該嘗試在多大程度上推送“僅標題”模型(或者至少是“幾乎只有標題”,以允許靜態)。 你可能會走得很遠 - 聽到那些嘗試過的人也會很有意思。

可能值得嘗試使用靜態庫來分離和封裝實現,否則將所有代碼保存在頭文件中。 我可以看到一些問題,但我們當前的運作方式是無故障的。

可以將所有代碼放入.h文件中。 與流行的看法相反,這不會復制.obj文件中的代碼。 現代編譯器比這更聰明。

編譯雖然有些問題。 如果你有20個.h文件全部包含在main.cpp中,編譯main.cpp將需要一段時間。 每當你的一個包含文件發生變化時,它將被重新編譯,包括你的所有20個實現.h文件。

那就是風格。 這對我來說只是看錯了。 但這是一個偏好問題。

然后有參考。 如果ClassA使用ClassB,而ClassB使用ClassA,那么您首先包含哪一個?

頭文件(.h)用於定義接口,以便您的類和代碼可以在其他翻譯單元中使用。 如果將實現放在.h文件中,那么最終會得到相同代碼的多個副本,並編譯到包含該.h文件的每個翻譯單元中。 這使得將代碼分成可以單獨研究和開發的小塊的觀點失敗了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM