Определения функций, отсутствующие в intellisense в Visual Studio С++ 2005-2013

Следующая проблема накладывает один из моих проектов на долгое время:

Некоторые определения функций (из .cpp файлов) исключаются/скрыты от intellisense!

Невозможно " Перейти к определению" для этих функций, а также не указано в панели навигации.

Однако функции отображаются в списке автозаполнения. Проблема только в файлах .cpp, файлы .h отлично разбираются. "Готовая декларация" тоже работает.

Это то же самое с 2005 года, с каждой новой версией, я надеялся на исправление, но, похоже, это не признается как ошибка кого-либо еще.

UPDATE: Я проследил это следующим образом: все функции, содержащие определенный макрос, не распознаются intellisense. Первоначальный макрос был

#define forlist(x,list) for( auto x= list.begin(); x.valid(); ++x)

но вы также можете использовать упрощенный тестовый пример

#define fortest(x)  for( auto x= 1; x< 2; ++x)

void myclass::TestFN()
{
    fortest( g )
    {
        g;
    }
}

Следующим шагом будет поиск обходного пути (или попытка просмотреть отчет об ошибках в micrsoft).

Пожалуйста, не слишком много говоришь об этом макросе. Это существующий код реализации списка, который я не могу изменить. Я мог бы просто НЕ использовать макрос, но я все еще думаю, что это ошибка VS.

Самое смешное, что следующий (действительно *** ic macro) прекрасно работает:

#define fortest(x)  for( auto x= 1; x< 2; ++x) {

void myclass::TestFN()
{
    fortest( g )
        g;
    }
}

Может ли быть, что intellisense рассматривает случай 1 как нелегальное определение локальной функции? (см. http://connect.microsoft.com/VisualStudio/feedback/details/781121/c-intellisense-mistakes-loop-expression-for-function-definition)

Следующая работа отлично тоже

#define fortest(x)  for( auto x= 1; x< 2; ++x)

void myclass::TestFN()
{
    fortest( g )
        g;
}

Ответ 1

Как обычно, интерес к моему вопросу встал через пару часов, поэтому мне пришлось разобраться в этом сам...

Нам просто нужно использовать концепцию cpp.hint файлов.

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

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

#define forlist(x,list)

ПРИМЕЧАНИЕ. Ваш кэш reset IntelliSense для использования новых данных из измененного файла cpp.hint. Вы должны:

  • удалить папку ipch (обычно она помещается в папку Solution).
  • удалить все *.sdf файлы в папке Solution.
  • удалить все файлы *.VC.db в папке Solution или в папке ipch.

Для более продвинутых макросов (например, с макросами "start" и "end" для кодовых блоков) есть и другие трюки.

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

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