Qt 的最佳实践包括和预编译头文件?

2024-05-02

当使用现代和最新的 C++ 编译器(例如 MSVC2015)并激活预编译头时,当前关于包含 Qt 头文件的“最佳实践”是什么?

Example:

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

vs.

#include <QtCore>
#include <QtGui>
  • 我应该为新项目选择什么约定?

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

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


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

一般来说(对于 Qt 包含是这样,但对于任何其他第三方包含也是如此,例如 STL,甚至当包含您自己的代码时),您应该使包含最少。包含的文件越少,编译速度就越快。包含实际不需要的文件会使编译速度变慢。此外,如果您包含但不使用的此类头文件被编辑/修改(一般情况下,第三方头文件不应出现这种情况),则包含它的任何文件都需要重新编译,即使它没有真正使用包含的代码......

因此,一般规则是仅包含您真正需要的文件。所以如果你的文件只需要QStringList,更喜欢包括<QtCore/QStringList>而不是<QtCore>.

如果您担心编译时间,还要确保在必要时仅包含头文件 (.h) 中的文件,如果可以使用前向声明,请使用它并且仅包含实现 (.cpp) 中必要的头文件。当头文件被修改时,这将大大减少项目的编译时间(读这个 https://stackoverflow.com/questions/3962708/how-much-do-forward-declarations-affect-compile-time).

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

  • 预编译头文件应该主要是第三方头文件,这样它们就不会被改变。因为如果发生更改,那么所有文件都需要重新编译......
  • 编译器必须支持预编译头(否则,编译可能会工作,但最终也可能会变慢,因为每个文件最终都会包含项目的所有预编译头......所以可能比实际需要的文件更多)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 的最佳实践包括和预编译头文件? 的相关文章

随机推荐

  • 如何仅使用物理 wsdl 文件生成服务引用

    我多年来一直在创建和使用 Web 服务 并且始终能够使用 Visual Studio 从客户端创建服务引用 我需要使用第三方服务 但他们拒绝打开其安全性 以便我可以查看 wsdl 并进行服务引用 这是一项面向公众的服务 因此我认为不需要这种
  • ruby - 数组元素之间的排列

    我正在使用 ruby 在 Google Sketchup 中编写一个插件 在尝试排列数组中存在的两个数组时遇到了一个真正的问题 所有这些都取决于用户组合 我有一个数组数组 例如 1 lol so 当我们有这样的组合 1 2 3 没关系 它应
  • R:在组上应用函数

    我希望将函数应用于数据框 然后将该函数的结果存储在数据框中的新列中 这是我的数据框 tradeData 的示例 Login AL Diff a 1 0 a 1 0 a 1 0 a 0 1 a 0 0 a 0 0 a 0 0 a 1 1 a
  • 被调用的函数在被调用后如何返回给调用者?

    我读到 当程序进行函数调用时 被调用的函数必须知道如何返回其调用者 我的问题是 被调用的函数如何知道如何返回其调用者 是否有一种机制通过编译器在幕后工作 编译器遵循特定的 调用约定 该约定定义为您所针对的 ABI 的一部分 该调用约定将包括
  • Python - 如何将双引号附加到字符串并存储为新字符串?

    我正在使用 Python 2 6 并且想将双引号附加到字符串并将其存储为新的字符串变量 我不想打印它 但稍后在我的 python 脚本中使用它 例如 a apple b some function a gt b would be equal
  • 选择预先选择多个值的标签 - 在数据库中手动插入的值

    我需要在 select tag 中预先选择多个值 但我在空缺表中 手动 添加空缺 如下所示 我的控制器 def create hr curriculum generic HrCurriculumGeneric new params hr c
  • 为什么线性布局 maxHeight 不起作用?

    这是我的布局 我在线性布局上设置了最大和最小高度 但最大高度似乎不起作用 事实上如果TextView R id testo有很多文本 不会被修剪 如果我设置固定高度 则不会发生这种情况 但我不想设置固定高度 以便在选择溢出屏幕模式时正确调整
  • OpenAL 问题 - 改变源增益

    我最近一直致力于将我的游戏移植到跨平台 并决定使用 OpenAL 作为我的跨平台音频引擎 我有 16 个 通道 OpenAL 源 可以同时播放最多 16 个声音 为了播放声音 我切换哪个缓冲区链接到给定的源 并设置增益 源位置等 以便在给定
  • 生成转储并导致非托管代码崩溃?

    当我的应用程序突然崩溃时 有没有办法获得完整的故障转储 问题是 我怀疑这是由于非托管代码杀死了 net 框架本身 因此 除非在崩溃时应用程序附加了调试器 否则应用程序甚至没有机会处理崩溃 我无法附加调试器并等待 因为崩溃是随机发生的 而且我
  • Azure AppendBlob 块/写入数

    我在用AppendBlob在 Azure 中进行日志记录 经过一段时间我经历了409 Conflict Error 我的猜测是已达到最大块 写入量 50 000 有什么方法可以获取 blob 中的块 写入数量吗 In Azure 参考 ht
  • 使用 boto 和 python 从带有参数的布局创建 mTurk HIT

    我正在尝试利用 boto 在 Mechanical Turk 中生成 HIT 目标是使用我的 mTurk 帐户上已生成的通用布局 并向其传递图像 URL 以迭代创建 HIT 问题是 即使正确命名参数 如果图像 url boto 也不成功 我
  • 如何使 Raspberry Pi 3 可被 iOS 和 CoreBluetooth 发现?

    我有一个 Raspberry Pi 3 我正在尝试使其可供 iOS 设备发现 我跑了sudo hciconfig hci0 piscan让它被发现 我可以用我的 iMac 看到它 在 iOS 上 我使用 CoreBluetooth 并扫描附
  • 这段C++代码是如何工作的?

    我在 Geek For Geeks 中看到了下面的例子 include
  • 我如何告诉 AutoFixture 在实例化 TBase 时始终创建 TDerived?

    我有一个深度嵌套的对象模型 其中一些类可能看起来有点像这样 class TBase class TDerived TBase class Container ICollection
  • 多级QTreeView

    我很难理解如何使用 QTreeView 和 QStandardItemModel 设置多级 QTree 这是我所拥有的 from PySide QtGui import import sys class MainFrame QWidget
  • 如何获取C#中的异常错误代码

    try object result processClass InvokeMethod Create methodArgs catch Exception e Here I was hoping to get an error code 当
  • jquery $('id').text 带粗体

    我有一个 jquery 可以更改链接的文本 如下所示 if urlfind gt 0 linkurl text More info 和 HTML a href a 我试图为此链接添加粗体 但添加 b More Info b 让它们在文本本身
  • 是否可以告诉 jsdoc 在与源代码分开的文件中查找该代码的文档?

    我希望内联注释尽可能短 因为我的经验是超过 3 或 4 行的注释往往会被掩盖 从而产生很多不必要的 阅读手册行 遗留系统要求我遵守与 jsdoc 兼容的格式来记录代码 如果要正确记录许多不言而喻的事情 则需要明确声明它们 实际上每个标签都可
  • 使用 Jekyll 和 Kramdown 的目录

    我正在尝试在 Jekyll 网站的页面 而不是帖子 上使用 Kramdown 的自动 目录 生成器 includes toc html
  • Qt 的最佳实践包括和预编译头文件?

    当使用现代和最新的 C 编译器 例如 MSVC2015 并激活预编译头时 当前关于包含 Qt 头文件的 最佳实践 是什么 Example include