2017-06-02 57 views
-2

我是一個C++新手。我有Python的經驗,但C++是我的第二語言。現在,我正在學習如何使用頭文件和源文件來幫助組織和編譯項目時間。我理解引用頭文件(#include「foo.h」)的正確語法是什麼,但我不明白頭文件本身如何引用main.cpp中的源文件(foo.cpp)。我在頭文件中看不到foo.cpp中的任何引用,也沒有在main.cpp中引用。編譯器如何知道使用#include將foo.h與foo.cpp連接起來?道歉,如果這個問題是多餘的。我試過了。我發現了很多關於如何使用頭文件和源文件的信息,但沒有很好的解釋他們如何實際工作。頭文件如何引用源文件C++?

+0

編譯器完成你所說的。它不會自己縫合。 – drescherjm

+2

頭文件根本不參考源文件。源文件使用'#include'引用頭文件。 – cdhowie

+0

頭文件不參考源文件,編譯器不知道要一起編譯的源文件。您必須告訴編譯器使用哪些源文件來構建項目。 – NathanOliver

回答

2

它沒有。

首先,只是因爲有一個foo.h,並不意味着有一個foo.cpp。

所以,你真正的問題是「編譯器知道如何將main.cpp和foo.cpp放入同一個可執行文件?」基本上,因爲你告訴他們。

這在不同的操作系統和編譯器和構建系統上是完全不同的,但基本上,你做了兩件事之一。

a)您單獨編譯的文件,然後將它們鏈接在一起:

cl main.cpp 
cl foo.cpp 
link main.obj foo.obj 

二)在一起編譯:

cl main.cpp foo.cpp 

(這是真的只是一個快捷方式到上面,用編譯器自動執行單獨的步驟)

1

他們沒有。

每個.c.cpp文件是生成obj文件(.o)的單個編譯單元。這是編譯器的全部功能。每個obj文件可能包含未解析的引用。例如,如果您main.cpp使用了在foo.h聲明和foo.cpp實現的功能foo(),然後foo.o將包含編譯代碼爲foo(),並main.o將包含編譯代碼爲main(),其中包括一種叫做foo()的呼叫。然而,main.o不知道foo()究竟在哪裏,而且它不知道foo.o

然後obj文件通過鏈接器鏈接在一起。這是在obj中未解析的引用被解析的時候。鏈接器將main.ofoo.o作爲其輸入,然後鏈接器生成whatever.exe並連接這些片段。如果函數無法解析(例如,您忘記在鏈接器調用中包含foo.o),或者在多個obj文件中存在具有相同名稱的函數,則鏈接器將產生錯誤。