繁体   English   中英

逃避包括.h文件的头

[英]Evading including headers to the .h file

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

class abc;

代替:

include "abc.h"

但这只是在abc类未用作属性或返回值的情况下。 如果是参数,我可以使用原型...为什么?

另外,为什么在.h文件中包含如此多的标头如此糟糕?

谢谢

当您向前声明课程时:

class abc;

是成为不完整类型 ,并且您只能对不完整类型做某些事情。 例如,任何需要了解班级成员,甚至需要了解班级规模的知识,都需要完整的声明。

至于包括其他标头中的标头,我可以想到以下两个参数:

  1. 缩短了构建时间。
  2. 更少的依赖项。

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

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

如果是参数,我可以使用原型...为什么?

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

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

这本身并不普遍“不好”,但是对于许多编译器而言,这可能会减慢编译过程,因此通常将包含的内容减至最少。 现代编译器具有有用的功能(例如预编译的标头)以最大程度地减少影响,因此使用前向声明可以使您在实际操作中比实际问题更具美感。

class abc;

当您向前声明一个类型时,编译器会将其视为Incomeplete类型,并且它不具有有关该类型的内存布局/组成的任何信息。 因此,您不能要求编译器执行任何需要其了解此信息的操作。

使用不完整类型,您不能:

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

但是使用不完整类型,您可以:

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

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

不好是因为:

  • 仅包含标头仅复制将标头的内容粘贴到当前翻译单元。 这会增加编译时间并建立依赖关系。

包括许多标头很不好,因为如果您更改其中的一个标头,那么您也必须编译文件,这听起来似乎不是问题,但是对于大型程序,编译+链接可能会花费很多时间(有时数小时)

在需要生成代码之前,编译器只需要知道名称(而不是组成部分)即可。

因此,前进声明是必经之路-因为它不需要加载和解析。

顺便说一句-它有助于使makefile不必开始重新编译内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM