2013-01-02 21 views
1

我有一個個人項目,我懷疑會超過20對標題/ cpp文件。我想知道讓每個頭文件和cpp文件包含它需要的其他文件(或使用前向聲明),還是讓每個文件都包含「Includes.hpp」,後者又包含所有標準庫,會給出更好的結果每個類的前向聲明,然後包括我所有的其他頭文件。使用一個大的包含文件的優點/缺點

正如我所看到的,用一個大的頭文件:

  • 清理了一切
  • 讓您更輕鬆地從其他目錄這些文件(因爲你只需要導航使用一個文件,該文件然後連接所有其他的)
  • 將包括每個編譯,這考慮到這是一個小項目中的所有文件,不是缺點,因爲我將使用的所有文件的

這是個好主意嗎?

+2

首先,它會增加構建時間。每當你修改一件微不足道的東西時,所有的源文件都需要編譯。 –

回答

5

我要說的是一般這是有幾個原因是一個壞主意:

  • 它給你封裝差:客戶應該只是拉他們所需要的頭。通過這種方法,包含所有東西都會被吸收,正如Alok提到的那樣,將會增加構建時間和靈敏度以重建
  • 接口類和實現類之間沒有區別,即您的庫的客戶端使用的和內部使用的類客戶端不需要(也可能不應該)看到這個庫
  • 如果您的任何頭文件定義了宏,那麼這些文件可能會「泄漏」到包含頭文件的任何其他代碼中,這可能是不可取的。任何曾經輸入過#undef MIN的人都會知道這種痛苦。
  • 還有,如果你有幾個類,需要知道對方的遞歸包容的可能性,所以它可能是包容的順序敏感的,不然你會包括週期

我覺得雖然有是可以接受的一種情況,也就是說,如果您的庫僅提供了一些旨在由客戶端調用的類/函數,並且其餘的都只是實現使用的內部類。所以客戶可以包括mylib.h,這就是他們需要擔心的。如果您想將庫作爲靜態庫進行編譯,您可以只分發庫和一個頭,這也使得它更容易。

0

不是。

採用方便頭確實存在,心靈,它們可以用來包,走到一起的功能,而且還可以喜歡一個include到預先聲明的頭文件,如果你認爲90%的時候,頭部的客戶端也會要求包含對象的完整定義。

但是,全局標題是不好的風格,雖然您的項目現在很小,但稍後可能會增長。不得不解開這種事情,並重新打開標題,我只能說:沒有樂趣...

無論如何,收益是多少?如果項目很小,那麼開頭的標題很少,因此很少。

3

說實話我不會這樣做。你提到你的項目只有20個cpp文件,但是你沒有提到這些文件的大小以及它們將包含多少複雜的代碼。如果你把所有的東西放在一個大的頭文件中,每次你將不得不重新編譯這20個文件,並且如果這些文件包含大量的代碼,這會使編譯時間顯着增加。

當然,如果你想要在標題中包含來自標準庫或標題的標題,而不需要修改,那麼你可以將它們全部放在預編譯的標題中,讓所有的cpp文件包含它。但是,如果您要修改頭文件(例如更改類定義,添加typedefs等),則應該意識到每次修改都需要重新編譯所有cpp文件。根據這些文件的大小,每次小的編輯(更改函數名稱,添加空格,添加註釋)可能會延遲一分鐘,這可能需要五秒鐘(並且如果您使用更復雜的庫,例如Boost.Spirit,這些時間真的很快)。總之,如果你正在開發一個你需要維護的項目,那麼即使項目很小,我也不會把所有東西放到一個文件中,即使這個項目現在是現在也是