C ++构建过程(包括)

时间:2017-04-04 13:58:58

标签: c++ build linker include

我目前正在从一本名为Alex Allain的书中学习C ++ - 跳入c ++,我在第21章陷入困境。它详细介绍了C ++构建过程,我得到了它,除了2部分:

首先:

“头文件不应包含任何函数定义。如果我们在头文件中添加了函数定义,然后将该头文件包含到多个源文件中,则函数定义在链接时会出现两次。这会让链接器感到困惑。“

第二

“永远不要直接包含.cpp文件。包含.cpp文件只会导致问题,因为编译器会将.cpp文件中每个函数定义的副本编译到每个目标文件中,并且链接器会看到多个相同功能的定义。即使你非常小心你如何做到这一点,你也会失去单独编译的节省时间的好处。“

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

从一个或多个translation units创建C ++程序。每个翻译单元(简称TU)基本上是一个包含所有包含头文件的源文件。创建目标文件时,实际上是在创建TU。在链接时,您将获取编译器创建的目标文件(TU)并将它们与库链接以创建可执行程序。

程序只能有一个定义。如果您有多个定义,则链接时会出错。定义可以是变量定义,如

int a;

double b = 6.0;

它也可以是函数定义,它是函数的实际实现。

您只能拥有单一定义的原因是因为这些定义在加载程序时被映射到内存地址。变量或函数不能同时存在于两个地方。

这是您不应将源文件包含到其他源文件中的原因之一。这也是你不应该在头文件中有定义的原因,因为头文件可以包含在多个源文件中,因为这会导致定义在多个TU中。

当然有一些例外情况,例如将某个功能标记为inlinestatic。但这已经解决了,因为这些定义不是从TU导出的,链接器也看不到它们。