7

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

我正在编写一个 Qt 应用程序,并且我已将常用文件(并且不会更改)放在一个名为“Util.h”的文件中。

实用程序.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;
...
  • 这是一个更好的解决方案吗?
  • 另外,我知道有一种叫做precompiled headers的东西,但我自己从未使用过。这可能是我的问题的解决方案,我应该研究一下吗?如果这有什么不同,我在使用VS2012的Windows上。
  • ...并总结所有问题。你会代替我做什么?
4

2 回答 2

5

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

有更好的方法吗?

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

这会大大减慢编译时间吗?

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

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

是的。远期申报的成本非常非常小。

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

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

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

...并总结所有问题。你会代替我做什么?

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

于 2013-04-28T10:39:12.667 回答
1

您所做的很常见,尽管它会放置在预编译的标头中。

预编译的头文件(连同 precompiled.cpp)只是一个将首先编译的头文件。然后可以将来自此编译的 obj 文件直接包含到其他头文件中。这可以防止所有 .cpp 文件一遍又一遍地编译公共头文件和 cpp 文件。这将编译时间加快了几个数量级。

设置预编译的头文件非常简单,网上有很多资源可以做到这一点。

于 2013-04-28T07:59:45.980 回答