有什么方法可以在所有新的Qt项目上强制使用QT_NO_FOREACH?

时间:2019-04-11 08:31:20

标签: c++ visual-studio qt qt-vs-addin

由于C ++ 11中包含range-for,因此我们正在迁移Qt代码,因此它不再使用Q_FOREACH / foreach宏。为了强制迁移,我们将QT_NO_FOREACH预处理程序定义手动添加到我们检查的每个项目中。我们使用Visual Studio和Qt VS Tools加载项。

我的问题是:有什么方法可以将这样的宏自动添加到新的Qt项目中?我已经检查了Qt VS Tools的全局设置,那里什么也没有。可能是加载项中的一些隐藏变量我们可以更改吗?

enter image description here

很显然,我们可以手动添加它们,但是我们希望有一些一次性解决方案。我们还考虑了属性页的使用,但是它们要么基于用户(不是存储库的一部分,并且将适用于所有项目,不仅是Qt),或者必须手动包含在项目中(在这种情况下)只需在项目设置中手动添加定义会更容易。


注意:我们知道将表格Q_FOREACH迁移到范围内的含义,以及如何正确进行更改以避免COW处罚。如果您想了解更多信息,请检查hereherehere

1 个答案:

答案 0 :(得分:0)

看看Qt VS Tools的源代码,可以看到预处理器定义是从位于qmake.conf的{​​{1}}文件的内容中添加的,其中包括{{ 1}}。

只需将<QTDIR>\mkspecs\win32-msvc定义添加到这些文件中的任何一个,使用该版本的Qt的所有新项目现在都将删除对<QTDIR>\mkspecs\common\msvc-desktop.conf的支持。我更喜欢将它添加到QT_NO_FOREACH中,因为所有VS项目都使用它。

Q_FOREACH

注意:添加定义后,请使用新的VS实例,因为该插件会缓存common\msvc-desktop.conf文件的内容。


如果好奇的话,在Qt VS Tools中添加这些定义的确切位置是在DEFINES += QT_NO_FOREACH 方法中,文件``\ src \ qtprojectlib \ QtProject.cs`:

qmake.conf

关于这个问题,我的第一个想法是修改Qt的模板,但它有两个缺点:随插件的每个新版本更新模板,更重要的是,如上面的代码所示,在项目的初始配置期间,所有预处理器定义都会被覆盖。