2011-11-11 21 views
2

我有3個類(它可能是300),每個類都有自己的頭和實現。 我想寫一個'優雅'的方式來組織我加載任何三類中的每一類所需的課程。也許這個例子可以幫助...關於標題,轉發和如何組織很多包括

我:class1的類class2 CLASS3

每頭有:

​​

每實現了:

#define DIRECT_STYLE 
    #include "general.h" 

OK 我要去寫一個'general.h'文件,其中我有:

#ifndef DIRECT_STYLE 
#ifndef CLASS1_H 
#include "class1.h" 
#endif 
#ifndef CLASS2_H 
#include "class2.h" 
#endif 
#ifndef CLASS3_H 
#include "class3.h" 
#endif 
#endif 

#ifndef FORWARD_STYLE 
class Class1; 
class Class2; 
class Class3; 
#endif 

// a lot of other elements needed 
#include <string.h> 
#include <stdio.h" 
.... 
#include <vector.h" 
(all the class I need now and in the future) 

這是一個很好的結構?或者我正在做一些白癡的事情? 我的目標是有一個獨特的'general.h'文件來編寫所有我需要的元素... 這是否正常工作? 謝謝

+1

這有什麼用? –

+0

是的,這很愚蠢。不要在每個TU中都包含所有內容,否則構建時間將會到地獄。 –

+0

我認爲這個策略會讓你在開始得到一個相當複雜的項目時分得一塌糊塗:p –

回答

4

的基本規律可循的:

  1. 讓每一個源文件中包括所有它需要以獨立的方式得到編譯的頭文件。避免讓頭文件通過其他文件間接包含在源文件中。
  2. 如果您有構建大多數源文件需要的構造,然後將它們放在一個公共標題中,並在需要它的源文件中包含標題
  3. 無論您身在何處,都可以使用前向聲明。有幾種限制條件可以讓您避免使用它們,請閱讀this瞭解有關這些情況的更多信息。

總的來說,避免在源文件中包含不必要的代碼通過公共頭文件是一個好主意,因爲它只會導致代碼膨脹,因此請儘量減少代碼。包括頭球攻門稍稍整個頭部竟然複製粘貼到您的源文件,包括不必要的文件有幾個缺點,即:

  1. 增加編譯時間
  2. 全局命名空間的污染。
  3. 預處理器名稱的潛在衝突。
  4. 增加二進制文件的大小(在某些情況下,雖然不總是)
4

這現在可能是個好主意,但不會縮放,應該避免。你的general.h文件將包含大量的文件,因此包含它的所有文件將(a)由於內存限制需要很長時間來編譯或不編譯,並且(b)每次都必須重新編譯任何東西的變化。

直接在每個文件中包含你需要的頭文件,並定義一些前向聲明文件,你應該沒問題。

0

#define在頭可能會是好的,但它可以通過許多渠道傳播,並可能導致問題。更嚴重的是,任何時間general.h或其任何包含更改您的整個項目重建。對於小型項目而言,這不是問題,對於大型項目而言,這會導致無法接受的構建時間。

相反,我利用一些指導原則:

  • 在頭部,向前聲明一下就可以了,任何明示或#include "blah_fwd.h"所看到的標準庫。
  • 所有頭文件應該能夠自己編譯,而不是依賴於源文件,包括早些時候。這可以很容易地被所有的源文件首先包含自己的頭文件檢測到。
  • 在源文件中,包含你需要的東西(通常你不能在源文件中使用前向聲明)。
  • 另請注意,千萬不要在標頭中使用using,因爲它會污染全局名稱空間。

如果這看起來像很多工作,不幸的是,這是因爲它。這是一個從C繼承而來的系統,需要一定程度的程序員維護。如果你希望能夠在高層決定什麼是你的項目所使用的,並讓編譯器/運行庫找出它,也許C++不是你的項目的正確語言。

+0

好的!感謝大家!答案證實了我的擔心。再次感謝 ! – tonnot