在hpp文件中声明方法时编译的优点是什么

时间:2014-02-12 21:51:49

标签: c++ header

hpp文件中,我们有方法声明,在cpp文件中我们有方法的定义。如果我只在cpp头文件中声明的方法中对hpp文件进行了更改。是否需要重新编译?如果是,在此案例中使用hpp文件有什么好处?

我读了其他相关主题,他们没有直接回答为什么在这种情况下使用hpp更好。

3 个答案:

答案 0 :(得分:3)

是的,当您更改cpp文件中的某些内容时,需要重新编译。

我们将声明.h.hpp)与定义.cpp)分开的原因非常简单 - 这是保持简单和有效的最简单方法。

  1. 系统简化了各种其他文件中的包括声明
  2. 如果您将项目编译为libdll,则可以分发不带定义的头文件。
  3. 当您更改与所包含的*.cpp文件关联的*.h中的内容时,您可以避免包含其他标头的重新编译类。在这种情况下 - 只需要重新编译一个类,而不是所有类(请注意:只有在不改变标题时才会这样。)。
  4. 但有些情况下希望文件分开。 templatesinline方法就属于这种情况。

答案 1 :(得分:1)

在这种特定情况下,它使您无需重新编译每个 cpp文件,该文件包含包含已更改构造声明的hpp文件。


通常,您的头文件(.h或.hpp)仅包含声明。当然也有例外,例如很多编译器仍然无法处理模板类的单独声明和定义,但为了简单起见,我们坚持这一点。 此外,您可以说声明为编译器提供了获取所需信息所需的所有信息。一个知道如何使用它的类。

  • 需要为此类的实例分配的大小
  • 类的可调用方法
  • 如果该类是多态的

因此头文件不仅包含类的接口,还包含编译器需要了解的有关类的其他信息。

如果要使用在头文件中定义的类,则需要包含它。 C ++编译器单独编译每个cpp文件。但首先,预处理器会扩展源文件。这意味着它扩展了所有#defines。但它也递归地用相应的文件替换所有#include指令。这称为翻译单位。

然后编译器获取此转换单元并将其编译为目标文件。然后,链接器将所有目标文件链接在一起以形成二进制文件。但是,编译器通常会进行某种优化。他们可以检测自上次编译以来翻译单元是否发生了变化。然后他们只编译它,如果有必要,因为进行了更改。

因此,如果对包含在不同cpp文件中的头文件进行更改,则所有这些源文件的转换单元都将更改,编译器必须重建相应的目标文件。但是,如果您可以将更改限制为仅在cpp文件中,则只有一个翻译单元会更改,并且必须重新编译。

在大项目中,这种优化可以将构建时间从几小时缩短到几分钟。甚至有一些编程技术旨在减少文件之间的依赖关系,以实现更快的编译时间。例如,Pimpl习惯用法可用于减少依赖性。

答案 2 :(得分:0)

hpp文件可以包含在多个cpp文件中。此外,它可以包含在多个hpp文件中。因此,当您更改hpp文件时,应该重新编译包含它直接或通过另一个hpp文件的每个cpp文件。当您更改cpp文件时,只应重新编译单个cpp文件。对于一个大项目来说差异很大。