如何正确包含Qt头文件?

6
到目前为止,我知道几种包含Qt类的方法:
  • #include <QtModule>

    这将引入特定模块的所有类,例如QDomDocumentQDomElementQDomNode和许多其他类,从#include <QtXml>中引入。

  • #include <QClassName>

    这添加了一个特定类的声明,例如QEventQStringListQFile

  • #include <qcstyleheader.h>

    这与上一种方法效果相同,只是头文件名称不同。

那么,还有其他包含Qt类的方法吗?它们是否等效,或者因某些原因而更喜欢其中一些?这是否取决于在.cpp.h文件中进行#include?这是否影响编译速度和可执行文件的大小?

简而言之,什么是最好的方法?


此外,#include <QtModule/QClassName>(例如 #include <QtCore/QThread>)和 #include <QtModule/qcstyleheader.h> 似乎都可以工作,总共提供了5个选项。 - Arthur Tacca
4个回答

10

通常情况下,头文件越多,编译器解析每个模块所需的时间就越长。(显然,预编译头文件可以使其中一些内容失效。)因此,你通常希望只包含构建你的应用程序所需的最少数量的头文件。

如果你在给定的编译单元中只使用了少数几个类,则只需按名称包含这些类,采用现代化的风格:

#include <QEvent>
#include <QPainter>
#include <QFont>
如果您使用给定模块中的大量类,则包括模块级别的头文件可能同样容易,例如:
如果你使用一个模块中大量的类,那么包含该模块的头文件也许是最简单的方法,例如:
#include <QtGui>

如果没有较新的样式头文件,通常只使用旧的 .h 样式。

现在,预编译头文件通过一次编译成二进制形式来减轻许多这些问题。但是,在编译时加载预编译符号并搜索它们仍然会产生开销。因此,您放入的内容越少,构建就越有效率。


2
有人知道如何让Visual Studio自动完成停止匹配.h版本,而不是给我其他选项吗?我必须在使用它时一直与VS作斗争:“不!当我输入关闭>时,我只想停在那里,不要添加.h!” -> [ESC] “啊”>真的很烦人。 - Edward Strange
1
我认为在2010年你可以禁用头文件的自动补全。转到“工具->选项->文本编辑器->C/C++->高级->禁用 #include 自动补全”。 - RedX

1

这似乎是一个通用的包含问题。答案很简单:只包含必要的内容。否则,会减慢编译速度。在头文件中,尝试使用前向声明。如果这不够,那么就包含声明类的头文件。


1

我认为没有一种普遍的“正确”方式来包含... 我偏爱第二种方式,因为它最容易 - 你只需要在文件中使用的每个类上都这样做,不需要过多思考。

至于编译速度,是的,Qt头文件编译起来需要花费一些时间。如果你想加快编译速度,可以在.cpp文件中 #include 所有需要的内容。有时候你也需要在.h文件中进行 #include - 如果你声明了一个类,你总是需要 #include 它的基类,以及任何你在类内通过值保存或在类函数中传值的成员的类。然而,对于那些被声明为指针、智能指针或引用的成员和函数参数,你可以用 "class foo;" 声明替代 #include。这样你的头文件会编译得更快,但实际使用这些类时仍然需要 #include 它们。


我认为没有一种普遍正确的方法来包含...这是不正确的,因为Qt不能合理地支持每个人的意见或喜好。Qt本身支持#include <QClass>#include <QtModule>。如果你做其他事情,那就只能自己承担后果:这可能是可以接受的,也可能不是。保持可维护性和风格的一致性有其好处。 - Kuba hasn't forgotten Monica

1
个人而言,我发现将我使用的所有Qt包含文件放在预编译头文件中(例如example),而不是在每个.h/.cpp文件中按需包含,可以获得显着的好处(编译时间缩短约30%?)。当然,小的缺点是,你可能会忽略你的各个源文件具体依赖于哪些Qt部分,但我自己并没有发现这是一个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接