Qt包含和预编译头的最佳实践?

时间:2017-10-12 08:38:28

标签: c++ qt include qt5

当前"最佳做法"关于在使用现有的和最新的C ++编译器(例如MSVC2015)并且已经激活预编译头文件时包含Qt头文件?

示例:

#include <QStringList> 
#include <QTreeWidget>
#include <QListWidget>

VS

#include <QtCore>
#include <QtGui>
  • 我应该为新项目选择哪种惯例?

  • 两者的优点/缺点是什么?

  • 新项目更常见的是什么?

3 个答案:

答案 0 :(得分:2)

据我所知,Qt包含和预编译头文件没有特定的限制/推荐/优点/缺点。当包含第三方头文件(Qt或boost或其他)时,适用相同的规则。

一般情况下(对于Qt包括,但对于任何其他第三方包括,例如STL,甚至包括您自己的代码),您应该使您的包含最小化。您包含的文件越少,编译速度就越快。包含您实际不需要的文件会使编译速度变慢。此外,如果您包含但不使用的头文件被编辑/修改(通常不应该是第三方头文件的情况),任何包含它的文件都需要重新编译,即使它不是真的使用包含的代码......

因此,一般规则是仅包含您真正需要的文件。因此,如果您的文件只需QStringList,则首选包含<QtCore/QStringList>而不是<QtCore>

如果您担心编译时间,还要确保只在必要时包含头文件(.h)中的文件,如果可以使用前向声明,请使用它并且只包含实现中的必要头文件(.cpp )。当头文件被修改时,这将大大减少项目的编译时间(read this)。

现在,如果您的项目包含许多包含一些Qt文件的文件,您可以使用预编译的头来优化编译。这些文件将被编译一次,只编译一次。但是,由于所有文件最终都会使用相同的预编译头文件(本身包含许多头文件),因此只应在以下情况下执行此操作:

  • 预编译的头文件应该主要是第三方头文件,因此它们无意更改。因为如果进行更改,那么您的所有文件都需要重新编译...
  • 编译器必须支持预编译头(否则,编译可能会起作用,但也可能最终变慢,因为每个文件最终都会包含项目的所有预编译头...所以可能需要的文件比实际需要的多。)< / LI>

答案 1 :(得分:0)

包含较少的标题会减少编译时间,只有这样,所以如果你这样做

#include <QtCore/QStringList>

编译它比你做的快一点

#include <QtCore>

如果您确定依赖于QtCore中的所有内容,请将其包括在内,如果没有,请单独包含每个标题。

答案 2 :(得分:0)

我在所有项目中使用next(对于预编译的头文件):

sapply(unique(Country), function(cn)
  summary(lm(IP[Country == cn] ~ IP2[Country == cn]))$r.sq)
#         A         B 
# 0.9451881 0.9496636 

仅在连接模块时才包含必要的定义。适用于msvs + qt addin或基于cmake的项目(我使用cotire)。

相关问题