Почему макрос Q_FOREACH прерывает VS2010 intellisense?

У меня есть проект С++ в VS2010 с Qt 4.7.4, и у меня часто возникают проблемы с IntelliSense (как и все мы...). Конкретная проблема заключается в том, что иногда тело функции (в файле .cpp) не может быть найдено. Если я нажму на это тело функции, раскрывающийся список (который обычно показывает функцию, в которой вы находитесь) пуст.

Сегодня я заметил это поведение сразу после добавления оператора foreach() (макрос Qt Q_FOREACH). Затем я заменил макрос foreach() соответствующим for(int i = 0; i < ...), а IntelliSense сразу снова отобразил функцию.

Итак, я хотел бы знать:

  • Может кто-нибудь, пожалуйста, подтвердите это поведение и скажите мне это в комментарии?
  • Почему это происходит?
  • Есть ли способ обхода, который позволяет мне продолжать использовать Q_FOREACH?

Ответ 1

Вы должны использовать концепцию файлов cpp.hint.

В принципе, вы должны поместить неприятные макросы в файл с именем "cpp.hint" и поместить этот файл в свой каталог решений (который не работает для меня, возможно, нестандартный макет проекта) ИЛИ в родительском каталоге где находятся ваши файлы кода. (работал у меня)

В этом файле вы просто помещаете неприятные макросы БЕЗ правого, поэтому в вашем случае:

#define foreach()

или, может быть, лучше

#define Q_FOREACH(variable, container)
#define foreach(...)
etc.

ЗАМЕЧАНИЕ, что вам может потребоваться перезагрузка или перезагрузка или скрипка с функцией для установки эффекта после установки определения в файл cpp.hint.

UPDATE. Действительно, я только что нашел, что мне нужно внести некоторые изменения в .cpp файл (например, добавить новую строку) для эффекта, который нужно выполнить. Исправление не применяется автоматически.

Исходная ссылка: http://msdn.microsoft.com/en-us/library/dd997977.aspx

Причина проблемы заключается в том, что производительность Intellisense (потенциально) резко снизилась бы, если бы ей пришлось анализировать все макросы в проекте, поэтому она только анализирует данные, указанные явно в 'cpp.hint'.

В исходном тексте Microsoft говорится, что вы можете использовать любой каталог в "Путь из корневого каталога исходного файла в каталог, содержащий исходный файл. В типичном проекте Visual С++ корневой каталог содержит решение или файл проекта.

Вы можете найти основной файл cpp.hint в папке "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcpackages" для справки