包含Qt标头的正确方法是什么?

时间:2010-12-14 09:24:52

标签: c++ qt qt4

到目前为止,我知道#include Qt类的几种方法:

  • #include <QtModule>

    这会带来特定模块的所有类,例如QDomDocumentQDomElementQDomNode以及来自#include <QtXml>的众多其他类。

  • #include <QClassName>

    这增加了可能想要使用的特定类的声明,例如QEventQStringListQFile

  • #include <qcstyleheader.h>

    除了不同的标题名称外,这会影响前一种方法。

所以我想知道,还有其他方法可以#include Qt课吗?它们是否相同,或者由于某些原因,它们中的一些是否优先于其他人?这取决于#include - .cpp.h文件中的{{1}}吗?这会影响可执行文件的编译速度和大小吗?

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

4 个答案:

答案 0 :(得分:10)

通常,头文件越多,编译器解析每个模块所需的时间就越长。 (显然预编译的头文件会产生一些问题。)因此,您通常希望包含正确构建应用程序所需的最少头文件。

如果您只在给定的编译单元中使用几个类,那么只需按名称包含类,采用现代风格:

#include <QEvent>
#include <QPainter>
#include <QFont>

如果您使用来自给定模块的大量类,则可能同样容易包含模块级标头,例如:

#include <QtGui>

如果不存在较新的样式标题,通常只使用较旧的.h样式。

现在预编译的头文件通过编译成二进制格式来缓解许多这些问题。但是,将预编译符号加载到内存中并在编译时搜索它们仍然需要付出代价。所以你投入的越少,构建效率就越高。

答案 1 :(得分:1)

这种接缝是一般的包含问题。答案很简单:只包括你必须的东西。否则你正在减慢编译速度。在标题中,尝试转发声明。如果这还不够,那么请包含声明该类的标题。

答案 2 :(得分:1)

我认为没有任何普遍的正确的方式包含...我的首选方式是第二种方式,因为它最简单 - 你只需为你在文件中使用的每个类都这样做,需要更少的思考。

至于编译速度,是的,Qt标题恰好需要一段时间才能编译。如果您想更快地编译,请#include .cpp文件中所需的一切。有时你需要包含.h文件 - 如果你声明一个类,你总是需要#include它的基类,以及你在类中保存值或在类函数中按值传递的任何成员的类。但是,对于那些声明为指针,智能指针或引用的成员和函数参数,您可以将#include替换为“class foo;”宣言。然后你的标题编译速度会更快,但是当你按值实际使用它们时,你仍然需要#include这些类。

答案 3 :(得分:1)

我个人发现,包括我在预编译头文件(example)中使用的所有Qt,而不是每个.h / .cpp中包含的所有Qt包括显着的好处(编译时间约为30%?) 。当然,最小的缺点是,你可能会忽略你的个人源文件特别依赖的Qt,但我自己并没有发现这是一个问题。