c++ - 有没有办法在所有新的 Qt 项目上强制 QT_NO_FOREACH ?
问题描述
由于在 C++11 中包含 range-for,我们一直在迁移 Qt 代码,因此它不再使用Q_FOREACH
/foreach
宏。为了强制迁移,我们手动将QT_NO_FOREACH
预处理器定义添加到我们检查的每个项目中。我们使用 Visual Studio 和 Qt VS Tools 插件。
我的问题是:有没有办法自动将这样的宏添加到新的 Qt 项目中?我检查了全局 Qt VS Tools 设置,但那里什么也没有。可能是我们可以更改加载项中的一些隐藏变量?
显然,我们可以手动添加它们,但我们希望有一些一次性解决方案。我们还考虑了属性页的使用,但它们要么是基于每个用户的(不是存储库的一部分,并且适用于所有项目,不仅是 Qt 的),或者必须手动包含在项目中(在这种情况下在项目设置中手动添加定义会更容易)。
注意:我们知道将表单迁移Q_FOREACH
到 range-for 的含义,以及如何正确地进行更改以避免 COW 惩罚。如果您想了解更多信息,请查看此处、此处和此处。
解决方案
看一下Qt VS Tools的源码,可以看出预处理器定义是从qmake.conf
文件的内容中添加的,位于<QTDIR>\mkspecs\win32-msvc
,其中包括<QTDIR>\mkspecs\common\msvc-desktop.conf
.
只需将QT_NO_FOREACH
定义添加到任何这些文件中,所有使用该版本 Qt 的新项目现在都将删除对Q_FOREACH
. 我更喜欢将它添加到,common\msvc-desktop.conf
因为它被所有 VS 项目使用。
DEFINES += QT_NO_FOREACH
注意:添加定义后请使用新的 VS 实例,因为插件会缓存qmake.conf
文件的内容。
如果好奇,Qt VS 工具中添加这些定义的确切位置在WriteProjectBasicConfigurations(uint type, bool usePrecompiledHeader, VersionInformation vi)
方法文件中<qt-vstools>\src\qtprojectlib\QtProject.cs
:
// add some common defines
compiler.SetPreprocessorDefinitions(vi.GetQMakeConfEntry("DEFINES").Replace(" ", ","));
我对这个问题的第一个想法是修改 Qt 的模板,但它有两个缺点:模板随着插件的每个新版本而更新,更重要的是,正如您在上面的代码中看到的,任何预处理器定义在项目的初始配置期间被覆盖。
推荐阅读
- javascript - 为什么 for 循环显示未定义的结果?
- smooch - 将 Smooch 与代理平台连接
- unity3d - 如何在 Unity 中手动设置 Toggle UI 可交互大小?
- r - 如何找到数据框中的内容而不是R中的其他内容
- javascript - TypeError:重复声明,Typescript 项目中的模块构建失败错误
- css - 在图像悬停时显示产品标题
- python - 如何在一段时间后将 Active True 的布尔值更改为 false
- visual-studio-code - VS Code 编辑器,取消链接资源管理器窗格和编辑器选项卡
- cassandra - 使用 datastax 驱动程序创建 BoundStatement 时出现 NullPointerException
- javascript - 有没有办法检查 JavaScript/Node 应用程序中是否定义了所有函数引用?