收集共同包含在一个文件中 - 良好的做​​法?

时间:2013-04-28 06:49:13

标签: c++ include header-files forward-declaration precompiled-headers

我正在努力学习如何处理很多包含,并且仍然保持我的代码整洁。

我正在编写一个Qt应用程序,我把常用的文件(并没有改变)放在一个名为“Util.h”的文件中。

Util.h

#pragma once

#include <Core/IObserver.h>
#include <Core/Math.h>
#include <QAction>
#include <QDockWidget.h>
#include <QFileDialog>
#include <QGraphicsBlurEffect>
#include <QLabel.h>
#include <QMainWindow.h>
#include <QMenu.h>
#include <QMessageBox.h>
#include <QShortcut.h>
#include <QSignalMapper>
#include <QSound>
#include <QString>
#include <QTimer.h>
#include <QTreeView>
#include <QStandardItemModel>


// Path to icons
#define ICON_PATH                                               \
    "../../Assets/GUI/Icons/"

然后我将其包含在几乎所有标题文件

#include "Util.h"
#include "Manager_Docks.h"
#include "Manager_Tools.h"
#include "Manager_Console.h"
#include "ui_MainWindow.h"
...
  • 有更好的方法吗?
  • 这会减慢编译时间吗?

我也想到只在每个 .cpp 中包含 Util.h ,并为标题分别设置 Header_Util.h 文件,看起来像这样

Header_Util.h

#pragma once

class IObserver;
class QAction;
class QDockWidget;
class QFileDialog;
...
  • 这是一个更好的解决方案吗?
  • 另外,我知道有一些名为预编译标题,但从未使用过我自己。这可能是我的问题的解决方案,我应该研究一下吗?如果这有任何区别,我使用 VS2012 Windows
  • ...并总结所有问题。你在我的位置做了什么?

2 个答案:

答案 0 :(得分:5)

TL; DR:通常,在开发C ++或C时最好消除不必要的可见标题。

  

有更好的方法吗?

当你的项目不小时,这通常是一个非常糟糕的主意。大多数源不需要查看大多数文件的声明,而且这些是高级对象。至少按类别划分。

  

这会减慢编译时间吗?

一般来说,是的。示例:您的大多数源文件是否需要了解UI库?可能不是。

  

这是一个更好的解决方案吗?

是。前瞻性声明的成本非常小。

  

另外,我知道有一些叫做预编译的标题,但从未使用过我自己。这可能是我的问题的解决方案,我应该研究一下吗?

对于某些版本,他们可以节省大量时间。对于其他人来说,他们可能只会减慢速度。如果您选择使用它们,那么请测量构建时间以确认哪个更适合您的项目以及您需要的包含。

通常,您会发现 all 您的来源不需要了解非常高级别和大型的内容(例如GUI库和抽象层)。只有部分来源通常需要了解那些更高级别的库。这通常是将代码库分解为更小的目标/库的好点。

  

......并总结所有问题。你在我的位置做了什么?

我不会在标题中填写所有这些高级库/标题以供所有来源查看。在大型代码库中撤消是很痛苦的,并且在构建期间往往会花费很多。包含前向声明的标题很好。

答案 1 :(得分:1)

您正在做的事情很常见,尽管它会放在预编译的标题中。

预编译头(以及precompiled.cpp)只是一个将首先编译的头。然后,可以将此编译中的obj文件直接包含在其他标头中。这可以防止所有.cpp文件一遍又一遍地编译公共头文件和cpp文件。这样可以加快编译时间。

设置预编译头很简单,并且有很多在线资源可以做到这一点。