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

C++ 包含Qt头的正确方法是什么?,c++,qt,qt4,C++,Qt,Qt4,到目前为止,我知道几种方法来#包括Qt类: #包括 这带来了特定模块的所有类,例如QDomDocument、qdomeElement、QDomNode以及中的许多其他类 #包括 这添加了可能要使用的特定类的声明,例如QEvent,QStringList,QFile #包括 这与前一种方法的效果相同,只是标题名的外观不同 所以我想知道,有没有其他方法来包含Qt类?它们是等价的,还是因为某些原因,它们中的一些比另一些更受欢迎?这是否取决于#在.cpp或.h文件中包含-ing?这会影响可执行

到目前为止,我知道几种方法来
#包括
Qt类:

  • #包括

    这带来了特定模块的所有类,例如
    QDomDocument
    qdomeElement
    QDomNode
    以及
    中的许多其他类

  • #包括

    这添加了可能要使用的特定类的声明,例如
    QEvent
    QStringList
    QFile

  • #包括

    这与前一种方法的效果相同,只是标题名的外观不同

所以我想知道,有没有其他方法来包含Qt类?它们是等价的,还是因为某些原因,它们中的一些比另一些更受欢迎?这是否取决于
#在
.cpp
.h
文件中包含
-ing?这会影响可执行文件的编译速度和大小吗


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

这将是一个一般性的包含问题。答案很简单:只包含你必须包含的内容。否则会减慢编译速度。在标题中,尝试向前声明。如果这还不够,那么就包含声明类的标题。

我认为没有任何通用的正确方法来包含。。。我更喜欢的方法是第二种,因为它最简单——只需对文件中使用的每个类都这样做,就不需要太多思考


至于编译速度,是的,Qt头恰好需要一段时间来编译。如果您想更快地编译,请在.cpp文件中包含所需的所有内容。有时您需要包含在.h文件中—如果您声明了一个类,则始终需要#包含它的基类,以及您在类中按值保存或在类函数中按值传递的任何成员的类。但是,对于那些声明为指针、智能指针或引用的成员和函数参数,可以用“class foo;”声明替换#include。这样,头文件的编译速度会更快,但无论何时实际按值使用它们,都需要包含这些类。

通常,头文件越多,编译器解析每个模块所需的时间就越长。(显然,预编译的头文件呈现了一些没有实际意义的内容。)因此,您通常希望包含正确构建应用程序所需的最少头文件

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

#include <QEvent>
#include <QPainter>
#include <QFont>
#包括
#包括
#包括
如果使用给定模块中的大量类,则可能同样容易包含模块级头,例如:

#include <QtGui>
#包括
如果不存在较新的样式头,通常只使用较旧的
.h
样式


现在,预编译头通过一次性编译成二进制形式来缓解许多这些问题。但是,将预编译符号加载到内存中并在编译时对其进行搜索仍有成本。因此,您投入的越少,构建的效率就越高。

就我个人而言,我发现将我使用的所有Qt-include包含在预编译头()中,而不是在每个.h/.cpp中(根据需要),都有显著的好处(~30%的编译时间)。当然,次要的缺点是,您可能看不到您的单个源文件具体依赖于哪些Qt位,但我自己也没有发现这是一个问题。

有人知道如何让visual studio autocomplete停止拍摄.h版本,而不给我其他选项吗?在这个问题上,我一直在使用它,我必须与之抗争:“不!我只想到此为止,不要在我刚刚输入的结束语中添加.h>!”->[ESC]“啊”>非常讨厌。我想在2010年你可以禁用标题的自动完成。转到
Tools->Options->Text Editor->C/C++->Advanced->Disable#include auto completion
“我认为没有任何通用的正确方法来包含…”这是不正确的,因为Qt不能合理地支持每个人的观点或奇想。Qt本身支持
#include
#include
。如果你做了其他事情,那就靠你自己了:这可能是好的,也可能不是。可维护性和对某一风格的坚持都有其好处。此外,
\include
(例如
\include
)和
\include
似乎都能起作用,总共有5个选项。