Есть ли способ заставить QT_NO_FOREACH на всех новых проектах Qt? - PullRequest
1 голос
/ 11 апреля 2019

После включения range-for в C ++ 11 мы переносим наш код Qt, поэтому он больше не использует макросы Q_FOREACH / foreach. Чтобы форсировать миграцию, мы вручную добавляем определение препроцессора QT_NO_FOREACH к каждому проверяемому проекту. Мы используем Visual Studio и надстройку Qt VS Tools.

Мой вопрос: есть ли способ автоматически добавлять такой макрос в новые проекты Qt? Я проверил глобальные настройки Qt VS Tools и там ничего нет. Может быть какая-то скрытая переменная в надстройке, которую мы можем изменить?

enter image description here

Очевидно, мы можем просто добавить их вручную, но мы бы предпочли иметь какое-то решение "сделай это один раз". Мы также рассмотрели использование страниц свойств, но они либо основаны на пользователях (не являются частью репозитория, и будут применяться ко всем проектам, не только Qt), либо должны быть включены в проект вручную (и в этом случае было бы проще просто добавить определение вручную в настройках проекта).


Примечание. Нам известны последствия переноса формы Q_FOREACH в диапазон и как правильно внести изменения, чтобы избежать наказания COW. Если вы хотите узнать больше об этом, пожалуйста, отметьте здесь , здесь и здесь .

1 Ответ

0 голосов
/ 11 апреля 2019

Взглянув на исходный код 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 Tools, где эти определения добавляются, находится в методе WriteProjectBasicConfigurations(uint type, bool usePrecompiledHeader, VersionInformation vi), файл `` \ src \ qtprojectlib \ QtProject.cs`:

// add some common defines
compiler.SetPreprocessorDefinitions(vi.GetQMakeConfEntry("DEFINES").Replace(" ", ","));

Одной из моих первых мыслей по этому вопросу было изменение шаблона Qt, но у него было два недостатка: шаблоны обновляются с каждой новой версией надстройки, и, что более важно, как вы можете видеть в приведенном выше коде, любые определения препроцессора перезаписываются во время начальной настройки проекта.

...