【问题标题】:How to choose only the needed Qt headers?如何只选择所需的 Qt 头文件?
【发布时间】:2018-10-12 17:10:49
【问题描述】:

在每个文件中都包含大量 Qt 和项目头文件的大型 Qt 项目中,很容易:

  1. 包含不需要包含的额外 Qt 文件,因为它们已经包含在另一个 Qt 文件中(例如,qbytearray.h 包含在 qstring.h 中)。
  2. 忘记包含所需的 Qt 文件,因为它们已经包含在其他包含的项目文件中(例如,编译器发现 qstring.h 包含在您的另一个文件中并且不会抱怨)。
  3. 左侧包含了修改后不再需要的额外 Qt 文件。

即使使用现代编译器it is better to include the files needed,我也一直在阅读,只有那些,instead of the easy way of including more generic headers like QtCore and QtGui

规则似乎很简单:只包含您需要的所有内容,不要依赖其他包含的文件,以防它们将来发生变化(例如,qstring.h 不能再使用qbytearray.h,这对于项目也是如此文件),但实现起来并不容易。而 Qt Creator 对此并没有太大帮助,因为当您开始编写 QStr... 时,它会自动使用 QString 完成并编译,您甚至不会想知道为什么也不会考虑包含标题。

是否有 Qt 头文件依赖项列表或自动 Qt 工具或规则或其他东西来确保我选择了所有我需要的头文件而不是其他东西?这个问题对于 C/C++ 来说很普遍,这是一种获得最佳标头依赖关系的方法。

【问题讨论】:

  • 不幸的是,您只需要阅读代码即可。看看它用什么。知道标题提供了什么。然后编辑源以包含您需要的内容。 (据我所知)没有工具或其他魔法可以为您做到这一点。
  • Qt 非常适合前向声明,所以老实说,我不会担心对“仅”绝对需要的标头过于严格。你必须阅读代码,如果你从另一个用户那里拿起一个项目,这将是一项相当艰苦的工作来检查你可以删除和不能删除的内容。请记住,由于 Qt 当前包含的内容,某些包含可能是多余的(例如 QString 包括 ``QByteArray`),但如果您同时使用两者,则可能需要同时包含两者。最简单的方法是注释您的包含:说明您需要哪些类或函数(Boost 这样做)。
  • 那就太可惜了。这似乎是计算机应该擅长的事情之一。
  • Include what you use尝试。但它通常会严重失败。
  • 关于 Qt 标头的注释:您应该为一个类包含名为 exactly 的 Qt 标头 (<QObject> not <qobject.h>) ,因为这就是记录为 的内容保证保持稳定。 .h 的任何内容都可能在次要版本之间发生变化。

标签: c++ qt header-files


【解决方案1】:

尽量减少读取的包含文件数量的经验法则:

  1. .cpp 文件通常具有关联的标题。必须首先包含该标头 - 它确保标头将自行编译并且不会丢失任何依赖项。

  2. 对于任何类层次结构,仅包括最派生类的标头。例如。如果包含<QLabel>,则不需要<QFrame>,也不需要<QWidget>,也不需要<QObject>。如果包含<QGraphicsView><QLabel>,则不需要<QAbstractScrollArea>,也不需要<QFrame>,也不需要<QWidget>,也不需要<QObject>。以此类推。

  3. 除上述规则外,不要依赖“其他文件包含的文件”。 IE。 QString 包括 QByteArray 是一个实现细节,QString 的 API 不保证包含这样的内容。

最小化编译源文件数量的经验法则:

  1. 通过在每个实现新的QObject 类型的foo.cpp 末尾添加#include "foo.moc" 将编译文件的数量减少两个(!!)。

  2. 短类(总共 .h 文件,无需将它们分隔在 .h.cpp 之间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多