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

Ade*_*ost 7 c++ include header-files precompiled-headers forward-declaration

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

我正在编写一个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/"
Run Code Online (Sandbox Code Playgroud)

然后我将它包含在几乎所有的头文件中

#include "Util.h"
#include "Manager_Docks.h"
#include "Manager_Tools.h"
#include "Manager_Console.h"
#include "ui_MainWindow.h"
...
Run Code Online (Sandbox Code Playgroud)
  • 有没有更好的方法呢?
  • 这会减慢编译时间吗?

我也想到只在每个.cpp中都包含Util.h,并且对于头文件有一个单独的Header_Util.h,看起来像这样

Header_Util.h

#pragma once

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

jus*_*tin 5

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

有更好的方法吗?

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

这会减慢编译时间吗?

通常,是的。示例:您的大多数源文件是否需要了解UI库?可能不会。

这是更好的解决方案吗?

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

另外,我知道有些东西叫做预编译头文件,但从未使用过。这也许是我的问题的解决方案,我应该研究什么?

对于某些构建,它们可以节省大量时间。对于其他人,他们可能只会放慢脚步。如果选择使用它们,则测量构建时间,以确认哪个更适合您的项目以及所需的内容。

通常,您会发现所有来源都不需要了解非常高级的内容(例如,GUI库和抽象层)。通常,只有一部分资源需要了解那些更高级别的库。将您的代码库分解为较小的目标/库通常是一个好方法。

...并总结所有问题。在我这个地方你会做什么?

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