2016-12-15 19 views
0

例如,我有一個Foo類。我創建了Foo.h,Foo.cpp,然後在main.cpp文件中包含Foo.h。當我編譯代碼時,機器如何知道將類頭文件和類cpp文件關聯起來?它是由文件名完成的嗎?
我真的有興趣瞭解這個編譯和鏈接過程。C++編譯器(或鏈接器?)如何知道如何處理cpp和頭文件類?

+4

這兩個文件沒有關聯。沒有必要。編譯器和鏈接器都不會將文件包含爲文件,因爲在此之前,預處理器步驟會將所有內容都放在一起。 – deviantfan

+1

此網站回答關於代碼問題的具體問題。你正在尋找一個C教程。 – kabanus

+0

它根本沒有關聯文件名,它只查找符號名。您的'main.o'將引用'Foo.h'中的符號_declared_,這些符號在'Foo.cpp'中是_defined_,因此可以在鏈接時找到'Foo.o'。 – Useless

回答

3

當我編譯代碼機器如何知道關聯類頭文件和類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 
相關問題