我最近浏览了一个 C++ 应用程序的源代码,发现每个类都没有#include
它需要的组件,而是#include
'da "Precompiled.h" 头文件。在这个 Precompiled 标头中包含了应用程序中的几乎所有标头(不是所有标头,很明显,列表的长度和顺序是经过深思熟虑的)。从本质上讲,这意味着每个类都包含应用程序中的所有其他类。
这是明智的吗?为什么或者为什么不?
我最近浏览了一个 C++ 应用程序的源代码,发现每个类都没有#include
它需要的组件,而是#include
'da "Precompiled.h" 头文件。在这个 Precompiled 标头中包含了应用程序中的几乎所有标头(不是所有标头,很明显,列表的长度和顺序是经过深思熟虑的)。从本质上讲,这意味着每个类都包含应用程序中的所有其他类。
这是明智的吗?为什么或者为什么不?
通常,如果您编写应用程序,您应该只包含 cpp 文件中真正需要的头文件。如果你有一个非常大的应用程序,你应该在头文件中使用前向声明,并在 cpp 文件中包含必要的文件。这样一来,代码的更改只会对 cpp 文件产生最小影响,因此编译器只需编译真正更改的内容。当涉及不经常更改的库或代码时,情况可能会完全翻转。文件名“Precompiled.h”已经是一个提示。编译器可以将头文件预编译为一个特殊的目标文件,通常称为 PCH 文件。这样,编译器就不必在每次编译时解析每个包含。在重嵌套包含上,这对编译速度有很大影响,因为只有一个预解析文件而不是许多文件要加载和解析。要存档,您必须将一个或多个头文件声明为一种用于构建预编译头文件的中心文件。你如何做到这一点在不同的编译器之间有所不同。例如 Visual Studio 使用头文件“stdafx.h”作为头文件预编译的中心。因此,只有不经常更改的头文件才应该包含在其中。此外,该文件必须首先包含在每个 cpp 文件中。这是因为编译器无法再检测到之前包含的包含文件是否会对预编译文件产生影响。为避免这种情况,不允许在预编译包含之前包含。
回到你的问题。将每个文件包含在一个头文件中以将其用作预编译头文件根本没有意义,因为它与预编译头文件的含义相冲突。
这是一个非常糟糕的主意。
对于 .cpp 文件,仅包含最少数量的 #include 文件。
因此,当其中一个发生更改时,make(或道德等价物)将不需要重新编译整个批次。
在开发过程中节省大量时间。
PS优先使用前向声明#include