我对学习C++很感兴趣,对于多头文件的用途我很好奇。为什么你不能在一个头文件中包含所有东西?为什么你使用多个头文件?
回答
是的,你可以拥有一个头文件。然而,随着项目的增长,这个头文件很快就会变成一个难以维护且速度慢的混乱。
你可以拥有在一个头文件中的一切。你甚至可以将你的整个程序放在一个文件中。
把事情分成不同的小文件的好处是你一次编译小部分,你只需要重新编译组件已经改变的那些部分。您还可以将通用代码放入单独的文件中,并使用单独项目中的这些文件,而无需在项目中复制粘贴代码。所以如果你发现一个bug,你可以修复一次,所有的项目都能从修复中受益。
为什么你不能只在一个头文件中包含所有东西?
如果您将所有内容都塞进单个标头,那么对该标头的每一次更改都将导致包含该标头的每个文件的重新编译。在你的情况下,这将是整个项目。
当您有很多小文件并且只有在绝对必要时才包含它们,管理项目会更容易。
关键字这里是模块化:
模块化是可被分离并重新组合的系统的部件的程度。
正如其他人已经提到的那样,您可以在单个文件中编写程序。而且,你可以把它写在一行中。但是,你不这样做,因为单独的和重新组合这个程序的一部分,如果它不编译就更不用说调试了。
标题存在组织。
对于一个非常简单的项目,一个头文件可以做得很好。你甚至可以根本不使用头文件,只需将所有内容写入单个文件。
但是,一旦你成长为一个更大的项目,其中包含并行系统,在多个上下文中使用的类或仅使用第三方库(如OpenSSL或MySQL),您不能简单地期望将所有代码放入具有数百万行代码的单个文件。
您可能还想知道为什么不在您的项目中将所有和任何必需的标题放在一个“common.h”中,然后在每个.cpp
中输入#include
。
答案是,因为每个.cpp
单独编译,所以,如果你限制了头部的每个.cpp
只需要什么的话,你会同时降低所产生的.obj
大小和编译时间。
此外,每次更改任何标题时,您都将被迫重新编译整个项目,而不是仅重新编译涉及的.cpp
。
除了已经发布的所有答案,你可能要考虑的是C++有哲学你付出你用什么或者相反,你不支付你不使用 。
如果我的应用需求,说,复数,然后我继续前进,#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
,然后,在我的项目
如boost
// @file project.cpp
// @brief Implements `project`
#include<project.hpp>
// go ahead and implement project
其他库通常提供一个“主”包括文件,例如使用如上所述的简化一个图书馆。
- 1. 你使用什么文件格式为你的应用程序,为什么?
- 2. 为什么使用_PROTOTYPE头文件
- 3. 为什么包含一个POSIX函数的多个头文件?
- 4. 除了头文件你需要什么来使用头中定义的函数
- 5. 你为什么使用T4?
- 6. 你使用什么文件夹结构
- 7. 为什么你不应该使用svg文件作为网站?
- 8. 为什么你或你不使用多边形解决方案?
- 9. 为什么你需要使用多个构造函数?
- 10. 什么是.htaccess文件。为什么我们使用这个文件。使用这个文件有什么好处?
- 11. 你使用什么变量名作为文件描述符?
- 12. 为什么一个单链表有多个头是件好事?
- 13. 在wordpress中使用多个头文件
- 14. 为什么pywhois返回空头文件?
- 15. 为什么Photoshop文件以8BPS开头?
- 16. 为什么包含标准头文件?
- 17. 为什么java中没有头文件?
- 18. 为什么关闭curl头文件?
- 19. 为什么我不能使用外部头文件?
- 20. 为什么c头文件不是使用ANTLR生成的1.5?
- 21. 为什么在WAV文件头中使用小端和大端?
- 22. 为什么在C++头文件中使用#ifndef和#define?
- 23. 什么固件文件格式使用头文件“Intel_FBF”
- 24. 这个头文件有什么问题?
- 25. 你为什么要复制一个文件描述符并从不使用它?
- 26. 为什么你会使用string.toString()?
- 27. 为什么你可以使用方法
- 28. 为什么你停止使用JSF?
- 29. 你为什么要使用umask?
- 30. 什么是BasicHttpRequest头文件
目前尚不清楚“一切”是什么意思。 –
出于同样的原因,您不会将所有文件放在桌面上,或将所有电子邮件保留在收件箱 - 组织中。 –