例如,我有一个Foo类。我创建了Foo.h
,Foo.cpp
,然后在Foo.h
文件中包括了main.cpp
。当我编译代码时,机器如何知道将类头文件和类cpp文件相关联?它是由文件名完成的吗?
我真的很想了解编译和链接的过程。
最佳答案
不,编译器没有这种自动关联。
如果您有一个包含所有函数和类的声明的头文件,则该头文件必须是任何使用它的翻译单元的#included
(.cpp
文件)。
该步骤(声明契约(Contract))由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