Определения функций, отсутствующие в 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'.