gpt4 book ai didi

C++构建过程(含)

转载 作者:行者123 更新时间:2023-11-28 05:12:44 27 4
gpt4 key购买 nike

我目前正在通过一本名为 Alex Allain - Jumping into c++ 的书学习 C++,但我卡在了第 21 章。它详细介绍了 C++ 构建过程,我明白了,除了 2 个部分:

首先:

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

第二个:

“永远不要直接包含 .cpp 文件。包含 .cpp 文件只会导致问题,因为编译器会将 .cpp 文件中的每个函数定义的拷贝编译到每个目标文件中,链接器会看到多个相同函数的定义。即使您非常小心地执行此操作,您也会失去单独编译的省时优势。”

谁能解释一下?

最佳答案

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

一个程序只能对任何事物有一个定义。如果您有多个定义,您将在链接时收到错误消息。定义可以是变量定义,如

int a;

double b = 6.0;

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

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

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


当然也有异常(exception),比如将函数标记为inlinestatic。但这已经解决了,因为这些定义不是从 TU 导出的,链接器看不到它们。

关于C++构建过程(含),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43209396/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com