我是一個C++新手。我有Python的經驗,但C++是我的第二語言。現在,我正在學習如何使用頭文件和源文件來幫助組織和編譯項目時間。我理解引用頭文件(#include「foo.h」)的正確語法是什麼,但我不明白頭文件本身如何引用main.cpp中的源文件(foo.cpp)。我在頭文件中看不到foo.cpp中的任何引用,也沒有在main.cpp中引用。編譯器如何知道使用#include將foo.h與foo.cpp連接起來?道歉,如果這個問題是多餘的。我試過了。我發現了很多關於如何使用頭文件和源文件的信息,但沒有很好的解釋他們如何實際工作。頭文件如何引用源文件C++?
-2
A
回答
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.o
和foo.o
作爲其輸入,然後鏈接器生成whatever.exe
並連接這些片段。如果函數無法解析(例如,您忘記在鏈接器調用中包含foo.o
),或者在多個obj文件中存在具有相同名稱的函數,則鏈接器將產生錯誤。
相關問題
- 1. nuget引用c + +頭文件
- 2. C++分開頭文件和源文件
- 3. C頭文件和源文件
- 4. c - 用源文件和頭文件編譯主文件
- 5. C中的頭文件和源文件如何工作?
- 6. 源文件和頭文件
- 7. 兩個頭文件或源文件互相引用
- 8. Visual Studio引用頭文件和源文件
- 9. 從Gtk C++源文件和頭文件創建Glade XML文件
- 10. 如何在頭文件中引用typedef?
- 11. 如何從C++文件調用Objective C頭文件?
- 12. 如何使用多個源文件和頭文件
- 13. 在C++源文件中包含C++ 11頭文件
- 14. C++:名稱空間 - 如何在頭文件和源文件中正確使用?
- 15. 如何用文件索引生成diff頭文件?
- 16. C/C++頭文件文檔
- 17. C:包括源文件,而不是頭
- 18. VC11 LNK1107引用頭文件
- 19. 在多個源/頭文件中使用C++類時設置頭文件
- 20. 沒有源文件的頭文件
- 21. jni中的頭文件和源文件
- 22. 源文件找不到頭文件
- 23. 爲頭創建的源文件文件
- 24. 每個源文件頭文件
- 25. C/C++如何訪問頭文件?
- 26. 在C++中,如何引用不同頭文件中的函數?
- 27. 如何在資源文件夾中引用javafx fxml文件?
- 28. 如何從C++頭文件調用CUDA文件?
- 29. Eclipse C++包括來自我的源文件夾的頭文件
- 30. C頭文件和源文件的標準結構
編譯器完成你所說的。它不會自己縫合。 – drescherjm
頭文件根本不參考源文件。源文件使用'#include'引用頭文件。 – cdhowie
頭文件不參考源文件,編譯器不知道要一起編譯的源文件。您必須告訴編譯器使用哪些源文件來構建項目。 – NathanOliver