前几天我和我的导师谈过,并问他这个问题。他告诉我,我可以选择较小的项目,但我正在开始一个国际象棋程序,我想知道Stack Overflow对这个问题的看法。我应该将所有标题包含在一个文件中,还是将它们分开?
答案 0 :(得分:13)
通常,您需要单独的标题。
包括超过必要的一些可能有些坏事。
这是编译时间慢的唯一原因。不必要的额外标题包含会降低编译速度,因为每个源文件都需要担心所需的信息量超出需求。它起初是一个小问题,在您知道之前,数百名开发人员每个人都在浪费几十到几百个小时,因为问题太过于难以解决。即使你正在处理小问题,理解标题的正确分离也很重要 - 第一次很容易正确,但如果忽略它就很难修复。
您失去了正确处理依赖关系的能力(取决于编译器/ IDE),并最终构建了比您需要构建的信息更多的信息。
您失去了可维护性。当你拥有大型的单个文件时,维护软件比使用大量小巧简洁的文件更难。
您使代码更难理解,因此更容易出错。通过将所有内容放在一个文件中,可以更容易地在巨大的标题中“丢失”。
答案 1 :(得分:2)
有些时候这种做法很有用:
预编译的头文件,代码实际上并没有经常改变。
的API
答案 2 :(得分:0)
一般来说这是一个坏主意,因为你可以拥有在这种情况下你无法解决的依赖。
但通常最好创建一个头文件,其中包含您从不同库或您自己的头文件中使用的所有基本头文件(带有结构和数据类型定义)。
答案 3 :(得分:0)
没有单向适合的解决方案。安排你的标题如何最有意义。 90%以上的时间,这意味着每个模块仅包含所需的标头。但是,有些程序几乎没有对模块之间的数据结构进行隔离 - 这可能意味着可以使用
#include "alltheheaders.h"
答案 4 :(得分:0)
对于较小的项目,您永远不会注意到差异。但是,一旦您的项目达到了显着的规模,请遵循旧的格言“仅在直接使用它们的文件中引用标题”。如果你有myclass.cpp和myclass.h,并且myclass.h不直接需要特定的头文件,请在cpp中引用它。
这可能需要更多时间,但最佳做法总是值得的。
答案 5 :(得分:0)
我只想补充一点,是的,这通常是一个坏主意,但它偶尔会有用。但是从来没有为整个项目。
例如,我最近编写了一个实用程序来在Windows上执行堆栈转储。我将要包含4个常见标题,因此我(在detail
文件夹中创建了一个约会我偷了形式提升使用)windows.hpp
,其中包括那四个。然后,实现可以使用该标头轻松获得必要的功能。
虽然它可能没有与mega-includes-480-header标头相同的重量,但它是一组常见标头的组合,它非常有用。这里的关键是它是一小部分相关的标题,用于代码的一部分。
答案 6 :(得分:0)
您应该将任何源(* .cpp,* .cc等)文件中包含的标头数量保持为编译该文件所需的最小数量。包括额外的标头会增加编译时间。您还应该尝试减少标题中包含的数量 - 您可以通过转发声明类而不是包含标题来实现此目的。
e.g。以下代码在标题
中包含不必要的包含Example.hh
#include "SomeClass.hh"
void SomeFunction(SomeClass const& obj);
Example.cc
#include "Example.hh"
void SomeFunction(SomeClass const& obj)
{
// code here
}
可以将include从头文件移动到源文件
Example.hh
class SomeClass;
void SomeFunction(SomeClass const& obj);
Example.cc
#include "Example.hh"
#include "SomeClass.hh"
void SomeFunction(SomeClass const& obj)
{
// code here
}