在hpp
文件中,我们有方法声明,在cpp
文件中我们有方法的定义。如果我只在cpp
头文件中声明的方法中对hpp
文件进行了更改。是否需要重新编译?如果是,在此案例中使用hpp
文件有什么好处?
我读了其他相关主题,他们没有直接回答为什么在这种情况下使用hpp
更好。
答案 0 :(得分:3)
是的,当您更改cpp
文件中的某些内容时,需要重新编译。
我们将声明(.h
或.hpp
)与定义(.cpp
)分开的原因非常简单 - 这是保持简单和有效的最简单方法。
lib
,dll
,则可以分发不带定义的头文件。*.cpp
文件关联的*.h
中的内容时,您可以避免包含其他标头的重新编译类。在这种情况下 - 只需要重新编译一个类,而不是所有类(请注意:只有在不改变标题时才会这样。)。但有些情况下不希望文件分开。 templates
和inline
方法就属于这种情况。
答案 1 :(得分:1)
在这种特定情况下,它使您无需重新编译每个 cpp文件,该文件包含包含已更改构造声明的hpp文件。
通常,您的头文件(.h或.hpp)仅包含声明。当然也有例外,例如很多编译器仍然无法处理模板类的单独声明和定义,但为了简单起见,我们坚持这一点。 此外,您可以说声明为编译器提供了获取所需信息所需的所有信息。一个知道如何使用它的类。
因此头文件不仅包含类的接口,还包含编译器需要了解的有关类的其他信息。
如果要使用在头文件中定义的类,则需要包含它。 C ++编译器单独编译每个cpp文件。但首先,预处理器会扩展源文件。这意味着它扩展了所有#defines。但它也递归地用相应的文件替换所有#include指令。这称为翻译单位。
然后编译器获取此转换单元并将其编译为目标文件。然后,链接器将所有目标文件链接在一起以形成二进制文件。但是,编译器通常会进行某种优化。他们可以检测自上次编译以来翻译单元是否发生了变化。然后他们只编译它,如果有必要,因为进行了更改。
因此,如果对包含在不同cpp文件中的头文件进行更改,则所有这些源文件的转换单元都将更改,编译器必须重建相应的目标文件。但是,如果您可以将更改限制为仅在cpp文件中,则只有一个翻译单元会更改,并且必须重新编译。
在大项目中,这种优化可以将构建时间从几小时缩短到几分钟。甚至有一些编程技术旨在减少文件之间的依赖关系,以实现更快的编译时间。例如,Pimpl习惯用法可用于减少依赖性。
答案 2 :(得分:0)
hpp文件可以包含在多个cpp文件中。此外,它可以包含在多个hpp文件中。因此,当您更改hpp文件时,应该重新编译包含它直接或通过另一个hpp文件的每个cpp文件。当您更改cpp文件时,只应重新编译单个cpp文件。对于一个大项目来说差异很大。