正在回避将标头包含到.h文件中

Evading including headers to the .h file

本文关键字:包含 文件      更新时间:2023-10-16

有人告诉我,如果可以回避的话,不要在.header中包含太多类,而是将它们包含在.cpp中。为此,他们告诉我创建原型类,如:

class abc;

而不是:

include "abc.h"

但这只是为了防止abc类没有被用作属性或返回值。如果它是一个参数,我可以使用原型。。。为什么会这样?

另外,为什么在.h文件中包含这么多头文件会这么糟糕?

感谢

如果它是一个参数,我可以使用原型。。。为什么会这样?

只要您不需要访问已声明类的内部结构,就可以使用正向声明,例如,当您声明指针、引用或将其作为参数传递时。不能使用正向声明来继承类、调用其任何成员函数或访问其成员,或声明非指针/引用类型的成员:这是因为编译器必须知道类的内部结构才能执行上述任何操作。

为什么在.h文件中包含这么多头文件这么糟糕?

这本身并不是普遍的"坏",但对于许多编译器来说,它可能会减慢编译过程,因此通常会尽量减少包含。现代编译器有一些有用的功能(如预编译的头(可以最大限度地减少影响,因此在可以使用的地方使用前向声明更像是一种美学选择,而不是一件实际的事情。

转发声明类时:

class abc;

is变成了一个不完全类型,并且对于不完全类型只能做某些事情。例如,任何需要了解类成员,甚至了解其大小的内容,都需要完整的声明。

关于包含来自其他标头的标头,我可以想到两个反对的论点:

  1. 改进了构建时间
  2. 更少的依赖性

第一个可能相关,也可能不相关,这取决于项目的大小、编译器、硬件等。第二个也有问题,因为它并没有真正减少类之间的依赖关系。

使用正向声明时,一种情况是在不同标头中定义的两个类之间存在循环依赖关系。

class abc;

当您正向声明一个类型时,编译器会将其视为Incoreplete类型,并且它没有任何关于该类型的内存布局/组成的信息。因此,您不能要求编译器执行任何需要它知道这些信息的操作。

不完整类型不能:

  • 使用它来声明成员
  • 使用此类型定义函数或方法

但对于不完整类型,您可以:

  • 将成员声明为指向不完整类型的指针
  • 声明接受/返回不完整类型的函数或方法
  • 定义接受/返回指向不完整类型的指针(但不使用其成员(的函数或方法

为什么在.h文件中包含这么多头文件这么糟糕

这很糟糕,因为:

  • 包括页眉只是将页眉的内容复制粘贴到当前翻译单元。这增加了编译时间并构建了依赖关系

包含许多标头是不好的,因为如果您更改其中一个标头,您也必须编译您的文件,这听起来可能不是问题,但对于大型程序来说,编译+链接可能需要大量时间(有时需要数小时(

在需要生成代码之前,编译器需要知道的只是名称,而不是组成。

因此,向前声明是可行的,因为它不需要加载和解析。

BTW-这有助于makefile不必开始重新编译东西。

相关文章: