2012-08-08 54 views
1

我有「Hello World」代碼使用函數fhi從另一個hi.cpp文件,它有它的頭。處理包含和使用標頭

糾正我,如果我的理解是錯誤的。根據以下幾點:

我可以做的包括CPP文件中像#include "c:\c\hi.cpp"而不是用頭不只是事實,即它會在頭文件更可讀的任何問題。

如果我包括我的主程序hi.h頭樣,必須hi.h包括hi.cpp,或者它是根據相同的文件名hi自動完成。我想知道編譯器如何知道函數fhi正文。

是否有可能爲頭文件和cpp文件有不同的名稱?

PROGRAMM:

#include "stdafx.h" 
#include "c:\c\hi.h" 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
fhi(1); 
return 0; 
} 

hi.h

#include <cstdlib> 
#include <iostream> 

int var; 
int fhi(int f); 

hi.cpp

#include <cstdlib> 
#include <iostream> 

int fhi(int f) 
{ 
return 0; 
} 

回答

2

必須hi.h包括hi.cpp

hi.h只包含聲明,可以是其他.cpp文件的聲明。

我想知道編譯器如何知道函數fhi的身體。

它沒有。您需要將所有* .cpp文件編譯到目標文件中。在你的情況下,你將有兩個目標文件:program.ohi.o。鏈接器現在可以獲取這兩個目標文件,並將可執行文件吐出。其他功能的參考(在這種情況下fhi(..)的實際定義)在這個階段被解決。

而且你爲什麼要使用的#includes絕對路徑?當你移動「c」目錄時它會中斷。

+0

hi.c和hi.cpp位於與項目不同的目錄中。我通過'#include「c:\ c \ hi.h」'告訴編譯器哪裏頭的標頭是抵制的。如何告訴編譯器hi.cpp在哪裏?你對絕對路徑是正確的。 – vico 2012-08-08 11:06:45

+0

使用相對路徑。類似'#include「../otherDir/otherFile.h」 – SuperSaiyan 2012-08-08 11:40:04

+0

'「../ otherDir/otherFile.h」'是的,這會告訴編譯器.h。但編譯器如何知道.cpp在哪裏?在我的情況下,cpp在'../ otherDir /' – vico 2012-08-08 16:15:50

2

通常會發生什麼事是,構建系統編譯.cpp文件到目標文件,然後是用於構建主可執行文件。告訴構建系統的手段差異很大。

重要的一點是您的hi.cpp必須包括hi.h。你也應該把一個include guardhi.h,使之安全,可以比包括在翻譯單元中一次。

+0

爲什麼'hi.cpp必須包含hi.h'?它也可以在沒有這種包含的情況 – vico 2012-08-08 10:58:56

+0

@ user1501700在你的情況下,它並不重要,但一般來說,分隔*聲明*和*定義*。函數或類成員函數的*定義*可能需要知道從頭獲得的其他聲明。 – juanchopanza 2012-08-08 11:14:14

2

我可以做的包括像的#include CPP文件「C:\ C \ hi.cpp」,而不是使用 頭沒有任何問題,除了這一事實,它看起來在頭文件更 可讀性。

是的,你可以這樣做,但不建議,其中一個問題是封裝;你沒有隱藏實現細節。您提到的可讀性也是一個問題,標題更容易閱讀,因爲它清楚地顯示了哪些方法是公開的。

如果我包括我的主程序hi.h頭樣,必須hi.h 包括hi.cpp,或者自動根據相同的文件名 喜來完成。我想知道編譯器如何知道函數fhi的身體。

標題需要顯式包含在hi.cpp和任何使用標題中定義的類的.cpp文件中。

是否有可能爲頭文件和cpp文件有不同的名稱?

是的,但不建議,它會使找到更難的東西。

作爲一般規則:考慮其他程序員可能希望查看您的代碼,因此您需要對其進行組織,以便易於閱讀和理解,並使其更容易爲期2年記住事情的真相。

2

在Visual Studio項目中包含的所有CPP文件將被編譯生成OBJ文件。這些OBJ文件將鏈接在一起形成EXE或DLL。

包括文件類似於在該位置粘貼文件的內容。唯一的區別是這個粘貼是在編譯期間由預編譯器完成的。

找出其中的功能體駐留由任一編譯器完成如果創建最終二進制當函數是內聯或通過接頭。

2

首先,如果頭文件在同一目錄作爲源文件包括它,你可以只使用

#include "hi.h" 

換句話說,你不必使用的完整路徑。 (例如參見"stdafx.h"。)

其次,在頭文件中,除非需要其他頭文件,否則不需要包含其他頭文件。在你的頭文件中,你所包含的頭文件中沒有任何需要的東西。第三,您應該保護頭文件頭文件不會被同時包含在同一個源文件中,這可以通過所謂的include guard來完成,在某些編譯器中通過名爲的特殊指令來完成。

四,在你的頭文件中你定義了一個全局變量var。這個變量會在每個包含頭文件的源文件中定義,這會導致錯誤。您需要變量聲明爲extern

extern int var; 

然後在一個源文件像你現在做您定義的變量。

第五,你永遠不應該包含頭文件的源文件(與你不必去想但一些特殊的例外)。相反,你的所有的源文件添加到項目中(我假設你在MS VisualStudio中),它就會全部建成並自動連接在一起。

第六,由於您似乎正在使用VisualC++,因此您可能正在使用稱爲precompiled headers的東西。這是編譯器用來加速編譯的東西。然而,爲了這個工作,你必須在所有源文件中包含"stdafx.h"。這實際上必須是每個源文件中的第一個非註釋行。