Я недавно изучал 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 работать в существующем коде:
- Настройте пустой проект (консольное приложение), создайте Main.cpp с фиктивным
void main() {}
в нем.
- Включите один из ваших сломанных заголовочных файлов и
math.h
- Build (для надежного обновления Intellisense необходимо скомпилировать)
- Проверьте, работает ли Intellisense, набрав, например,
sin(
и посмотреть, появляется ли справочная аргумент. Иногда это сработало бы, но помощь участника не сработала - так что попробуйте и это.
- Сделайте экземпляр чего-нибудь в заголовочном файле, build, посмотрите, удастся ли это убить IS.
- Удалить код из файла преступника и перейти к шагу 3
- После нахождения и исправления проблемного кода верните код, удаленный на шаге 5, попробуйте еще раз
- После того, как весь класс работает хорошо, создайте экземпляр следующего класса и так далее ...
Мне было легко найти способ определения местоположения кода, из-за которого возникли проблемы (я понимаю, что это может быть невозможно для действительно больших проектов, в моем случае только один файл из 97 создавал проблемы). Обратите внимание, что здесь «Build» относится к компиляции, этап компоновки не нужно завершать, поэтому с неразрешенными внешними интерфейсами все в порядке, IS должен обновляться независимо.
Другой метод обновления IS (кроме сборки) - сохранить все, закрыть рабочее пространство, удалить файл .ncb и снова открыть его. Затем подождите, пока «Обновление Intellisense ... (N)» исчезнет из строки состояния (N считается равным нулю, если он не проходит весь путь, он показывает прогресс в тех случаях, когда возникли проблемы). Я нашел это довольно утомительным.