Как заставить IntelliSense надежно работать в Visual Studio 2008 - PullRequest
40 голосов
/ 02 сентября 2008

Кто-нибудь знает, как заставить IntelliSense работать надежно при работе в проектах C / C ++? Кажется, работает около 1 из 10 файлов. Visual Studio 2005 выглядит намного лучше, чем 2008.

Изменить: Хотя это не обязательно решение, обходной путь, представленный здесь:

Как заставить IntelliSense надежно работать в Visual Studio 2008

Вероятно, это лучший выбор, если я хочу приличную систему IntelliSense.

Ответы [ 12 ]

31 голосов
/ 02 сентября 2008

Собственный intellisense C ++ не работает надежно ни в одной версии Visual Studio. Я считаю, что есть две общие проблемы:

1) Неправильно заданы пути к файлам заголовков. Когда вы найдете тип, в котором intellisense не работает, используйте IDE, чтобы просмотреть каждый заголовочный файл, чтобы найти тот, который содержит тип. (Щелкните правой кнопкой мыши на #include и выберите Открыть документ ...). Если это не удалось до того, как вы дойдете до файла, который объявляет тип, то это ваша проблема. Убедитесь, что пути поиска файла заголовка установлены правильно.

И

2) База данных intellisense повреждена. Это происходит все время. Вам необходимо закрыть решение, удалить файл .ncb, а затем снова открыть решение. Я разместил макрос, который я использую для этого, в ответ на другой вопрос здесь .


Препроцессор также может запутать intellisense - поэтому убедитесь, что любые #defines во время сборки также доступны для intellisense. Кроме этого, я не знаю, что еще может сломать это. Я не видел особых проблем с предварительными декларациями.

27 голосов
/ 02 сентября 2008

Я также понял, что Intellisense когда-то «теряется» в каком-то большом проекте. Зачем? Понятия не имею.

Именно поэтому мы купили Visual Assist (из Tomato software ) и отключили Intellisense, удалив dll feacp.dll в подкаталоге Visual studio (C: \ Program Files \ Microsoft Visual Studio 8 \ VC \ vcpackages)

Это не решение, а обходной путь.

6 голосов
/ 29 мая 2009

Похоже, на горизонте есть надежда для тех из нас, кто не может получить визуальную помощь:

Восстановление Intellisense

4 голосов
/ 02 сентября 2008

У вас установлены (или удалены) надстройки? Я считаю, что это влияет на мою интеллигентность.

Кроме того, просто убедитесь, что ваши Инструменты-> Параметры-> Текстовый редактор-> Все языки «Члены автоматического списка» и «Информация о параметрах» отмечены.

2 голосов
/ 15 октября 2010

Мое исправление к itellisense потребовалось после того, как эта ужасная утилита рефакторинга изменила мой код. Проблема заключалась в заголовочном файле класса, который включал в себя #include. Рекурсивная ссылка уничтожает itellisense. Признак этого - если itellisense может видеть другие классы, но не текущий. Кроме того:

Используйте #pragma один раз для устранения повторяющихся загрузок заголовка

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

Часто затрагивается только один объект класса. Он показывает, какие файлы (обычно заголовки) нужно просматривать.

2 голосов
/ 02 сентября 2008

Я не использую VS2008 для C ++, только VB & C #, но я обнаружил, что когда intellisense перестает работать (верно для VS2003 / 2005/2008), это происходит из-за того, что что-то в проекте / файле повреждено - обычно плохая ссылка или код.

VB и C # имеют гораздо лучшую поддержку intellisense из-за способности отражать ссылочные сборки для построения дерева intellisense.

C ++ должен пройти включаемые файлы для прототипов функций, и если пути не верны, он не найдет все заголовки прототипов.

1 голос
/ 05 декабря 2013

Я недавно изучал Intellisense в VS2008, так как я занимаюсь разработкой довольно большой библиотеки C ++ для числовой линейной алгебры, в которой широко используются шаблоны и тому подобное. Intellisense вскоре перестал работать над проектом, и я как бы сдался, но теперь он стал действительно раздражать без него, поэтому я решил заняться расследованиями. Вот что я узнал:

Предполагая, что есть файл (ы), содержащий код, который "нарушает" Intellisense,

  • если заголовочные файлы, которые нарушают Intellisense, находятся в проекте, но не являются #include d, они все еще работают в остальных файлах
  • если они включены, но объявленный внутри тип не используется, он все равно работает
  • если они включены и используется объявленный внутри тип, он все равно может работать немного (нет Intellisense для членов, нет Intellisense после появления данного типа, но по крайней мере глобальные имена и информация об аргументах до этого)
  • Если Intellisense не работает в одном файле .cpp, он все еще может работать в других, где проблемный код не включен или не используется (но я думаю, что если он выйдет из строя плохо, он будет отключен для всего проекта, хотя это было не случилось со мной)
  • Кажется, что Intellisense обновляется после успешной компиляции (иногда не раньше)
  • помещение неработающего кода в любой из #if 0, /* .. */ или //, кажется, облегчает Intellisense

Из функций, которые я использовал в C ++, Intellisense на самом деле всего несколько раз:

  • сравнение с '>' или '> =' в параметре шаблона (например, static_assert<(size > 0)>)
    • не решается с помощью двойных скобок (static_assert<((size > 0))> не помогает)
    • решается с помощью взамен '<' или '<=' (<code>static_assert<0 < size> работает)
    • решается путем сохранения значения в enum и использования его для специализации шаблона
  • явная специализация шаблона функции отключает информацию об аргументах (например, function<type>(args))
    • , вероятно, не может решить (может быть, обернуть в макрос), но я могу жить с этим, будучи сломанным
  • создание экземпляра типа элемента шаблона, например Matrix::MakeMatrixType<3, 3>::Result r;
    • трудно понять, почему именно это происходит (вероятно, из-за использования Eigen)
    • Обходной путь, перемещая такой код в отдельный .cpp, где IS не будет работать (не всегда возможно)

Казалось бы, некоторые из этих проблем связаны с неким "упрощенным" анализом, который менее силен, чем правильный синтаксический анализатор C ++. Имея вышеупомянутую информацию под рукой, «надежный» способ заставить Intellisense работать в существующем коде:

  1. Настройте пустой проект (консольное приложение), создайте Main.cpp с фиктивным void main() {} в нем.
  2. Включите один из ваших сломанных заголовочных файлов и math.h
  3. Build (для надежного обновления Intellisense необходимо скомпилировать)
  4. Проверьте, работает ли Intellisense, набрав, например, sin( и посмотреть, появляется ли справочная аргумент. Иногда это сработало бы, но помощь участника не сработала - так что попробуйте и это.
  5. Сделайте экземпляр чего-нибудь в заголовочном файле, build, посмотрите, удастся ли это убить IS.
  6. Удалить код из файла преступника и перейти к шагу 3
  7. После нахождения и исправления проблемного кода верните код, удаленный на шаге 5, попробуйте еще раз
  8. После того, как весь класс работает хорошо, создайте экземпляр следующего класса и так далее ...

Мне было легко найти способ определения местоположения кода, из-за которого возникли проблемы (я понимаю, что это может быть невозможно для действительно больших проектов, в моем случае только один файл из 97 создавал проблемы). Обратите внимание, что здесь «Build» относится к компиляции, этап компоновки не нужно завершать, поэтому с неразрешенными внешними интерфейсами все в порядке, IS должен обновляться независимо.

Другой метод обновления IS (кроме сборки) - сохранить все, закрыть рабочее пространство, удалить файл .ncb и снова открыть его. Затем подождите, пока «Обновление Intellisense ... (N)» исчезнет из строки состояния (N считается равным нулю, если он не проходит весь путь, он показывает прогресс в тех случаях, когда возникли проблемы). Я нашел это довольно утомительным.

1 голос
/ 02 июня 2011

У меня была очень досадная проблема, intellisense работал только в некоторых файлах без какой-либо очевидной причины ... Мне потребовалось несколько часов, чтобы покопаться в Google, но я наконец понял, что причина действительно рекурсивная ссылка! Я использовал:

#ifndef CLASS_H
#define CLASS_H
...
#endif

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

Но достаточно прокомментировать ifndef-define-endif и поставить:

#pragma once 

в начале заголовочных файлов, чтобы избежать переопределений и заставить Intellisense работать снова =) =)

По крайней мере, это сработало для меня, надеюсь, это полезно ...

Приветствие Francesco

1 голос
/ 02 сентября 2008

@ Джон Ричардсон / @ Джонатан Холланд

Мои включения настроены правильно, никаких проблем нет. Я также несколько раз пытался восстановить NCB, но он никогда не исправляет его на 100%.

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

class MyPredeclared;

class SomeOtherClass
{
private:
    MyPredeclared* m_pPointer;
}

Интересно, это напортачило? Есть еще идеи? Это определенно становится хуже, чем больше становится ваш проект.

0 голосов
/ 12 февраля 2014

Проблема с файлами .vcproj.

Вы найдете, если вы переключитесь в режим выпуска из режима отладки, выполните сборку, а затем попробуйте intellisense, это часто работает.

Закрыть Visual Studio. Если вы ищете файлы .vcproj в своем проекте, отредактируйте их и найдите первые два экземпляра AdditionalIncludeDirectories. Значение для этого должно выглядеть примерно как ".. \, .... \", а не "../..".

Повторно откройте ваш проект, дайте Intellisense закончить сборку, затем он должен быть исправлен.

...