正在回避将标头包含到.h文件中
Evading including headers to the .h file
有人告诉我,如果可以回避的话,不要在.header中包含太多类,而是将它们包含在.cpp中。为此,他们告诉我创建原型类,如:
class abc;
而不是:
include "abc.h"
但这只是为了防止abc类没有被用作属性或返回值。如果它是一个参数,我可以使用原型。。。为什么会这样?
另外,为什么在.h文件中包含这么多头文件会这么糟糕?
感谢
如果它是一个参数,我可以使用原型。。。为什么会这样?
只要您不需要访问已声明类的内部结构,就可以使用正向声明,例如,当您声明指针、引用或将其作为参数传递时。不能使用正向声明来继承类、调用其任何成员函数或访问其成员,或声明非指针/引用类型的成员:这是因为编译器必须知道类的内部结构才能执行上述任何操作。
为什么在.h文件中包含这么多头文件这么糟糕?
这本身并不是普遍的"坏",但对于许多编译器来说,它可能会减慢编译过程,因此通常会尽量减少包含。现代编译器有一些有用的功能(如预编译的头(可以最大限度地减少影响,因此在可以使用的地方使用前向声明更像是一种美学选择,而不是一件实际的事情。
转发声明类时:
class abc;
is变成了一个不完全类型,并且对于不完全类型只能做某些事情。例如,任何需要了解类成员,甚至了解其大小的内容,都需要完整的声明。
关于包含来自其他标头的标头,我可以想到两个反对的论点:
- 改进了构建时间
- 更少的依赖性
第一个可能相关,也可能不相关,这取决于项目的大小、编译器、硬件等。第二个也有问题,因为它并没有真正减少类之间的依赖关系。
当让使用正向声明时,一种情况是在不同标头中定义的两个类之间存在循环依赖关系。
class abc;
当您正向声明一个类型时,编译器会将其视为Incoreplete类型,并且它没有任何关于该类型的内存布局/组成的信息。因此,您不能要求编译器执行任何需要它知道这些信息的操作。
不完整类型不能:
- 使用它来声明成员
- 使用此类型定义函数或方法
但对于不完整类型,您可以:
- 将成员声明为指向不完整类型的指针
- 声明接受/返回不完整类型的函数或方法
- 定义接受/返回指向不完整类型的指针(但不使用其成员(的函数或方法
为什么在.h文件中包含这么多头文件这么糟糕
这很糟糕,因为:
- 包括页眉只是将页眉的内容复制粘贴到当前翻译单元。这增加了编译时间并构建了依赖关系
包含许多标头是不好的,因为如果您更改其中一个标头,您也必须编译您的文件,这听起来可能不是问题,但对于大型程序来说,编译+链接可能需要大量时间(有时需要数小时(
在需要生成代码之前,编译器需要知道的只是名称,而不是组成。
因此,向前声明是可行的,因为它不需要加载和解析。
BTW-这有助于makefile不必开始重新编译东西。
- vcruntime.h 从 Windows 包含文件夹中丢失?
- 禁止显示有关包含文件中 #pragma 包的警告
- 无法打开包含文件:在 vs2017 上'QtWidgets/qtwidgetsglobal.h'
- 包含文件 <sched_yield.h>在我的 RHEL 5 上找不到
- 尝试使用 MSVC 从源代码构建 qt 创建器:无法打开包含文件:"stddef.h":没有这样的文件或目录
- 无法打开包含文件'Graphics.hpp'没有这样的文件或目录,Visual Studio的其他包含不起作用
- 为什么 C++ 编译器在"c:program filesgnu emacsinclude"中查找包含文件?
- 包含文件中的 Typdef "未在此范围内声明"
- 错误: C1083: 无法打开包含文件:"boost/asio.hpp": 没有此类文件或目录
- SFML c ++ 当包含文件内游戏中发生事件时,如何使用铃声函数为我的游戏创建声音类?
- 在Windows上设置CMake和vcpkg时出错"无法打开包含文件"
- 致命错误 C1083:无法打开包含文件:"GL/glew.h":没有此类文件或目录
- Qt自动生成的.rc文件无法打开包含文件'windows.h'
- Visual Studio 停止识别任何包含文件
- 无法打开包含文件:"签证.h"
- 如何检查每个头文件是否包含必需的包含文件?
- Protobuf:无法在 message.pb.h 文件中打开包含文件 common.h
- extern 关键字在包含文件头文件C++
- 错误:无法打开包含文件:"MQTTAsync.h":没有此类文件或目录
- #include "date.h" 创建错误 E1696 无法打开源文件"date.h",也无法打开包含文件:没有这样的文件或目录