0
例如,我有一個Foo類。我創建了Foo.h
,Foo.cpp
,然後在main.cpp
文件中包含Foo.h
。當我編譯代碼時,機器如何知道將類頭文件和類cpp文件關聯起來?它是由文件名完成的嗎?
我真的有興趣瞭解這個編譯和鏈接過程。C++編譯器(或鏈接器?)如何知道如何處理cpp和頭文件類?
例如,我有一個Foo類。我創建了Foo.h
,Foo.cpp
,然後在main.cpp
文件中包含Foo.h
。當我編譯代碼時,機器如何知道將類頭文件和類cpp文件關聯起來?它是由文件名完成的嗎?
我真的有興趣瞭解這個編譯和鏈接過程。C++編譯器(或鏈接器?)如何知道如何處理cpp和頭文件類?
當我編譯代碼機器如何知道關聯類頭文件和類cpp文件?它是通過文件名來完成的嗎?
不,編譯器沒有這樣的自動關聯。
如果您有一個包含函數和類的所有聲明的頭文件,它必須來自使用它的任何翻譯單元(.cpp
文件)中的#included
。
(聲明合同的)步驟由c預處理器完成,其中#include "MyDeclarations.hpp"
的每次出現用翻譯單元中的完整文件內容MyDeclarations.hpp
取代。
一個簡單的例子:
Foo.hpp
class Foo {
public:
Foo(); // Constructor declaration
};
Foo.cpp中
#include "Foo.hpp" // <<<< Include declarations
Foo::Foo() {} // Constructor definition
的main.cpp
#include "Foo.hpp" // <<<< Include declarations
int main() {
Foo foo; // <<<<< Use declarations
}
到最後指示你的鏈接器施蒂希所有這些文件一起,你必須指從翻譯單元產生的文物。取決於工具鏈一點,但例如GCC你可以使用一些編譯器命令行如
$ g++ main.cpp Foo.cpp -o myProg
這兩個文件沒有關聯。沒有必要。編譯器和鏈接器都不會將文件包含爲文件,因爲在此之前,預處理器步驟會將所有內容都放在一起。 – deviantfan
此網站回答關於代碼問題的具體問題。你正在尋找一個C教程。 – kabanus
它根本沒有關聯文件名,它只查找符號名。您的'main.o'將引用'Foo.h'中的符號_declared_,這些符號在'Foo.cpp'中是_defined_,因此可以在鏈接時找到'Foo.o'。 – Useless