2011-08-03 54 views
5

我已經看到一個頭文件包含這樣的樣式,其中頭文件不包含其他頭文件,相應的* .cpp文件必須包含所有依賴項(並按正確順序包含它們)。在過去的美好時代,這可能會讓構建依賴關係跟蹤更容易(但我只是猜測)。現在有充足的理由嗎?C++頭文件不包含任何其他頭文件的任何好理由?

文件 「波黑」:

#ifndef _B_h_ 
#define _B_h_ 

// Note we do not #include "A.h" that contains class A declaration. 

class B 
{ 
public: 
    A a; // An A object. 
}; 
#endif // _B_h_ 

文件 「B.cpp」:

#include "A.h" // Must include this before B.h, otherwise class A not defined in B.h 
#include "B.h" 

... 
+1

你可以編輯你自己的問題標題,如果你想要它那樣命名。 –

+0

我懷疑你在實際生活中見過*那個例子,因爲它沒有編譯。您必須有權訪問每個成員對象的完整類型。 –

+2

祝願。 :) –

回答

4

似乎無論誰寫的代碼誤解了減少包含頭的數量的共同建議。通常建議刪除不必要的#include <>指令,以加速編譯。實際上,在大型項目中,它可以通過以下方式顯着加速編譯:

  1. 減少編譯器需要打開以編譯任何給定源文件的頭文件數;
  2. 減少標頭更改後需要重新編譯的源文件的數量。

一般情況下,人們會建議(其一直在編碼,我在工作的所有項目標準),使用前置聲明上課,除非在相關頭文件中定義的類是:

  1. 作爲一個基類;
  2. 用作數據成員;
  3. 有一個不完整的官方speciifcation(例如,只要標準庫容器有默認值,允許標準庫容器有額外的模板參數,所以轉發聲明它們是非標準的)。

在案例1和2中,#include <>指令必須所有相關的源文件和頭類定義之前出現。基本上,它只是將#include <>指令從標題移入每個依賴項。它會產生更多的代碼,並且不會帶來任何好處(例如,編譯時間等將相同)。出於這個原因,這個建議還伴隨着編碼標準中的另一個條目:每個頭文件應該「獨立」編譯(例如包含在源文件的第一行)。

8

是啊,這是不好的做法,因爲如果有人得到順序不對,他們會得到錯誤他們可能會或可能無法弄清楚。如果所有頭文件都包含防護,那麼包含所有其他頭文件的頭文件將不會成爲問題,這應該如何。

+1

+1。我想在包含Window頭文件之一的某個時候,我遇到了這種問題。文檔中提到了「當你包含X時,你還應該包括Y」。我的想法是「好的,如果X需要Y,那​​麼X爲什麼不包括Y本身?」。 – MRAB

+0

@MRAB我還記得類似的東西,但我不記得它是哪個頭。 –

+1

''必須包含在''之前,否則''包含'',這是不兼容的(並且已棄用?)。 –

2

現在有沒有很好的理由呢?

不,不是真的。人們做各種「有用」的東西,要麼是因爲他們不知道更好,不關心或者有更重要的事情需要擔心。當你的語言依賴預處理器而不是真正的模塊導入系統時,會發生這種情況。

我認爲最好的做法是確保人員#包括你的東西永遠不必擔心包含或隱藏先決條件的順序。無論如何,當然,除非你的手被某些第三方的愚蠢的宏伎倆逼迫。

4

這是一個非常糟糕的做法。讓編譯器找出正確的順序 - 它不太容易出錯。頭文件應該像編譯時一樣進行編譯 - 即,如果您的TU僅包含#include "B.h"

+0

編譯器無法弄清楚正確的順序。這甚至不是一個正確的命令。 –

+1

Moreso,既然*沒有辦法*你可以使用'B.h' *而沒有*也包括'A.h',所以'B.h'應該包含在'B.h'中是合乎邏輯的。你應該可以說,「我想要B類」,並且在任何情況下都可以通過包含B.h來實現。 –

2

是的,我會推薦#including'INTERFACE在任何頭文件中的任何依賴。

在這種情況下,是的:我會#include「A」(因爲B的接口依賴於A)。否則,如果實現使用「A」(但頭沒有),我只會在.cpp中包含A(因爲它不是接口的一部分)。

在任何情況下,我是否希望頭文件的順序很重要,如果完全可以避免的話。通常,標題順序應該不重要。

恕我直言...

PS: 多達Bjarne的Stroustrup的希望,否則,預處理和預處理宏仍然非常伴隨着我們。當然,在C-land中,當然也包括任何微軟API。尊重這一事實只是一種很好的形式。

2

我會考慮這種不好的風格。這將導致難以理解的錯誤。

您可能會這樣做的原因是爲了避免每次更改單個頭文件時重新編譯大量代碼。如果你發現自己處於這種情況,你可能會遇到設計問題。