我是学习 c++ 的新手,我很好奇多个头文件的目的是什么。为什么不能将所有内容都放在一个头文件中?
6 回答
这里的关键词是模块化:
模块化是系统组件可以分离和重组的程度。
正如其他人已经提到的,您可以在单个文件中编写程序。此外,您可以将其写在一行中。但是,您不要这样做,因为这样就很难分离和重组该程序的各个部分,更不用说在无法编译时对其进行调试了。
为什么不能将所有内容都放在一个头文件中?
如果您将所有内容都塞进单个标头中,则对该标头的每一次更改都会导致重新编译包含该标头的每个文件。在您的情况下,这将是整个项目。
当您有许多小文件并且仅在绝对必要时才包含它们时,管理项目会更容易。
标题的存在是为了组织。
对于一个非常简单的项目,一个头文件就可以了。您甚至可以根本不使用标头,而只需将所有内容都写在一个文件中。
但是,一旦您发展到一个充满并行系统、在多个上下文中使用的类或仅使用 OpenSSL 或 MySQL 等 3rd 方库的更大项目,您就不能简单地期望将所有这些代码放在一个包含数百万的文件中的代码行。
您可能还想知道为什么不将项目中所有必需的标头放在一个“common.h”中,然后#include
将其放在每个.cpp
.
答案是因为每个.cpp
都是单独编译的,所以如果你将每个标题限制为.cpp
只需要它的标题,你将减少结果.obj
大小和编译时间。
此外,每次更改任何标头时,您都将被迫重新编译整个项目,而不是仅重新编译所.cpp
涉及的项目。
除了已经发布的所有答案之外,您可能还想考虑 C++ 的哲学是您为使用的东西付费,或者相反,您不为不使用的东西付费。
如果我的应用程序需要,比如说,复数,那么我会继续#include
使用这个功能。如果我不需要它,那么我的代码甚至没有理由知道存在这样的概念。
当我确定我为给定类型的应用程序一遍又一遍地包含相同的头文件时,我创建了一个包含 include的主头文件,而我就是#include
那个头文件。
例如:
// @file project.hpp
// @brief provides all the functionality required by `project`
#include<library1.hpp>
#include<library2.hpp>
#include<library3.hpp>
// any type definitions go below this line
然后,在我的项目中
// @file project.cpp
// @brief Implements `project`
#include<project.hpp>
// go ahead and implement project
其他库,例如boost
通常提供“主”包含文件,例如上述文件,以简化使用该库。
您可以在一个头文件中包含所有内容。您甚至可以将整个程序放在一个文件中。
将事物分离成不同的小文件的好处是您一次编译小部分,并且您只需要重新编译那些组件已更改的部分。您还可以将通用代码放入单独的文件中,并使用来自不同项目的这些文件,而无需跨项目复制粘贴代码。因此,如果您发现错误,您可以修复一次,您的所有项目都将从修复中受益。
是的,您可以将所有内容都放在一个头文件中。但是,随着项目的增长,该头文件很快就会变得难以维护且编译缓慢。