Подтвердить что ты не робот

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

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

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

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

Возможно, лучший вариант, если я хочу приличную систему IntelliSense.

4b9b3361

Ответ 1

Я также понял, что Intellisense когда-то "потерян", в каком-то крупном проекте. Зачем? Не знаю.

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

Это не решение, просто обходное решение.

Ответ 2

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

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

и

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


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

Ответ 4

У вас есть какие-либо надстройки, установленные (или удаленные)? Я нахожу, что это эффект мой intellisense.

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

Ответ 5

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

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

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

Ответ 6

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

Используйте #pragma один раз, чтобы устранить дублированные нагрузки заголовков.

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

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

Ответ 7

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

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

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

class MyPredeclared;

class SomeOtherClass
{
private:
    MyPredeclared* m_pPointer;
}

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

Ответ 8

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

#ifndef CLASS_H
#define CLASS_H
...
#endif

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

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

#pragma once 

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

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

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

Ответ 9

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

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

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

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

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

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

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

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

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

Ответ 10

Об этой проблеме я заметил что-то интересное (на Visual Studio 2010): для решения этой проблемы я изменил #include sintax в моих заголовочных файлах, раньше был (старый проект выполнен с VS 2005 и снова открыт с использованием VS 2010):

#include <myfile.h> 

и я исправлю это следующим образом:

#include "myfile.h"

После того, как intellisense начнет работать правильно! Надеюсь, это поможет!

Ответ 11

Мне пришлось reset настройки...

C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE > devenv.exe/ResetSettings

поток здесь

Ответ 12

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

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

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

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