你曾经碰到的问题:
1.为什么有时会出现aaa已在bbb中重定义的错误?
2.为什么有时会出现无法解析的外部符号?
3.为什么有的内联函数的定义需要写在头文件中?
4.为什么对于模板,声明和定义都要写在一起?
编译单元
什么是编译单元呢?简单来说一个cpp文件就是一个编译单元。
编译单元:当一个c或cpp文件在编译时,预处理器首先递归包含头文件,形成一个含有所有 必要信息的单个源文件,这个源文件就是一个编译单元。
事实上编译每个编译单元(.cpp)时是相互独立的,即每个cpp文件之间是不知道对方的存在的(不考虑#include “xxx.cpp" 这种奇葩的写法)
编译器会分别将每个编译单元(.cpp)进行编译,生成相应的obj文件
然后链接器会将所有的obj文件进行链接,生成最终可执行文件。
内部链接与外部链接
那么什么内部链接和外部链接又是什么呢?
我们知道C++中声明和定义是可以分开的
例如 我们可以一个函数声明定义放在b.cpp中,在a.cpp只需再声明一下这个函数,就可以在a.cpp中使用这个函数了