我目前正在从一本名为Alex Allain的书中学习C ++-跳入c ++,我被困在第21章中。它详细介绍了C ++的构建过程,除了以下两个部分,我明白了:
第一:
“头文件不应包含任何函数定义。如果我们向头文件中添加了一个函数定义,然后将该头文件包含到多个源文件中,则该函数定义在链接时将显示两次。这会造成混淆链接器。”
第二:
“绝对不要直接包含.cpp文件。包含.cpp文件只会导致问题,因为编译器会将.cpp文件中每个函数定义的副本编译到每个目标文件中,并且链接器将看到该文件的多个定义。即使您非常谨慎地执行此操作,也将失去单独编译节省时间的好处。”
有人可以解释吗?
最佳答案
一个C ++程序是从一个或多个translation units创建的。每个翻译单元(简称TU)基本上都是一个包含所有头文件的单个源文件。创建目标文件时,实际上是在创建TU。链接时,将使用编译器创建的目标文件(TU),并将它们与库链接以创建可执行程序。
一个程序只能有一个单一的定义。如果您有多个定义,则链接时会出现错误。定义可以是变量定义,例如
int a;
要么
double b = 6.0;
它也可以是一个函数定义,它是函数的实际实现。
您只能使用一个定义的原因是因为在加载要执行的程序时,这些定义会映射到内存地址。变量或函数不能同时存在于两个位置。
这是您不应将源文件包括在其他源文件中的原因之一。这也是您不应该在头文件中定义的原因,因为头文件可能包含在多个源文件中,因为这将导致该定义在多个TU中。
当然也有例外,例如将功能标记为
inline
或static
。但这解决了,因为这些定义不是从TU导出的,链接器看不到它们。关于c++ - C++构建过程(包括),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43209396/