在C++中,当你编写了一个头文件(如MyLibrary.h
)和对应的实现文件(如MyLibrary.cpp
)时,其他源文件(如main.cpp
)只需要包含头文件(#include "MyLibrary.h"
)来访问在头文件中声明的类、函数等。实现文件(MyLibrary.cpp
)本身不需要被其他源文件包含。
编译器和链接器负责处理这种分离。当你编译一个包含#include "MyLibrary.h"
的源文件时,编译器会处理这个包含指令,将头文件的内容插入到该源文件中,但它不会直接处理实现文件(.cpp
)。相反,编译器会为每个.cpp
文件生成一个目标文件(在Windows上通常是.obj
,在Unix-like系统上通常是.o
),这些目标文件包含了该.cpp
文件中定义的函数和变量的机器码。
然后,链接器负责将这些目标文件(以及任何库文件)链接成一个可执行文件或库。链接器会查找并解析在目标文件中引用的外部符号(即在其他.cpp
文件中定义的函数、变量等)。如果链接器在链接过程中找不到某个引用的符号,它就会报错。
因此,当你在main.cpp
中包含MyLibrary.h
并使用其中声明的类或函数时,你实际上是在告诉编译器你希望使用这些声明。编译器会确保在main.cpp
中正确地引用了这些声明,并生成包含对这些声明引用的机器码的目标文件。然后,链接器会负责找到这些声明的实现(即MyLibrary.cpp
中定义的函数和变量),并将它们链接到最终的可执行文件中。
简而言之,你只需要包含头文件,而不需要包含实现文件。编译器和链接器会处理剩下的工作。