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

StackOverflow https://stackoverflow.com/questions/39474

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

И,

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


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

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

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

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

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

  

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

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

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

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

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

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

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

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

#ifndef CLASS_H
#define CLASS_H
...
#endif

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

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

#pragma once 

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

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

Ваше здоровье Франческо

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

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

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

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

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

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

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

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

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

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

#include <myfile.h> 

и я исправляю это с помощью

#include "myfile.h"

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

Проблема в файлах .vcproj.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top