2010-05-22 43 views
4

有一個.h文件和一個.cpp文件具有相同的名稱但擴展名不同。C++頭文件和實現文件:包含什麼?

如果我想用什麼在.cpp文件,我包括.h文件或.cpp文件?

+0

許多模糊包括http://stackoverflow.com/questions/280033/c-header-files-code-separation – 2010-05-22 09:33:55

回答

22

簡單的答案是,你幾乎總是想包含.h文件,並編譯.cpp文件。 CPP文件(通常)是真實的代碼,而H文件通常是前向聲明。

較長的答案是,你可以爲包括,它可能爲你工作,但都將給稍有不同的結果。

「include」的功能基本上是複製/粘貼該行中的文件。無論擴展名是什麼,它都會以相同的方式包含文件的內容。

但C++代碼,按照慣例,通常這樣寫:

SomeClass.cpp -

#include "SomeClass.h" 
#include <iostream> 

void SomeClass::SomeFunction() 
{ 
    std::cout << "Hello world\n"; 
} 

SomeClass.h -

class SomeClass 
{ 
    public: 
    void SomeFunction(); 
}; 

如果包括這類原因,你可以使用它的代碼。但是,如果您有多個包含相同.cpp文件的文件,則可能會出現有關重新定義的錯誤。頭文件(.h文件)通常只包含前向聲明,沒有實現,所以將它們包含在多個地方不會給你重定義的錯誤。

如果你以某種方式管理包括來自其他.cpp文件.cpp文件時,編譯沒有錯誤,你仍然可以出現重複的代碼。如果您在多個其他文件中包含相同的.cpp文件,則會發生這種情況。這就像你寫了兩次函數。這會讓你的程序在磁盤上更大,編譯時間更長,運行速度更慢。

主要需要注意的是,這個實現/向前聲明慣例並不適用於使用模板的代碼實現。模板代碼仍將作爲.h文件提交給您,但它(通常)直接在.h文件中實現,並且不會附帶.cpp文件。

+4

+1很好的答案,沒有任何「從不」。人們應該使用常識來分割代碼。是的,按照慣例,頭文件(* .h)的設計必須能夠在任何地方安全地包含,而不會在編譯單元中施加任何額外的依賴性或副作用(如具有「使用名稱空間...」)它包括在內。 – bobah 2010-05-22 09:41:28

+0

只是爲了澄清,當你說「包含.h文件和編譯.cpp文件」時,你的意思是除了包含來自所謂主類的頭文件(.h)之外,還必須添加實現( .cpp)文件與主類一起用於編譯器行? – StockB 2013-03-05 18:47:24

+0

@StockB:由於C++中沒有「主類」,所以不清楚你的意思是「與主類一起」,但你所說的含糊不清。另外,不同的編譯器工作方式不同,所以我不能說你可以肯定地將多個cpp文件添加到你正在使用的編譯器的命令行中。主要區別在於'.h'文件傾向於包含在內,而'.cpp'往往直接傳遞給編譯器。 – 2013-03-05 19:18:38

3

.h文件通常包含類聲明和.cpp文件的類定義(實現)。您應該在.cpp文件中包含.h。

好的經驗法則是永遠不要包含.cpp文件,因爲#include指令只是將包含文件的內容複製到包含文件中。你可能會以多種包含/定義結束,你肯定不想這樣做。

+0

不是說OP在問這個問題,但是你可能想在定義模板代碼時包含源文件。如果您試圖將轉發聲明和實現保存在單獨的文件中,或者您正在解決與模板相關的代碼擴展問題,您可能會這樣做。請參閱:http://www.parashift.com/c++-faq-lite/templates.html – 2010-05-22 09:35:50

2

通常,最好在頭文件中寫的.h

#ifndef H_someClass 
#define H_someClass 

類SomeClass的{市民: 無效SomeFunction(); };

#endif 

,爲了不要讓錯誤關於重新定義,當u需要在其他文件.cpp文件。