Мы пытаемся перейти от Code :: Blocks к Visual Studio Code для разработки на C / C ++.Основная причина заключается в том, что благодаря IntelliSense обеспечивается лучшее завершение кода.Но сравнение этих двух не должно быть темой здесь.
Чтобы компилировать наши старые проекты, мы создали make-файл и задачи в коде Visual Studio.Пока все работает отлично.
Там, где все стало сложнее, это разные цели сборки.Допустим, у нас есть пример проекта, в котором нам нужно скомпилировать две версии нашей программы, которые примерно на 95% одинаковы.Поэтому в Code :: Blocks-times мы решили сохранить все в одном проекте, но различать разные биты исходного кода с помощью define и ifdef.Таким образом, вы выбираете правильную цель сборки, которая добавляет определения к вызову gcc, и создается правильная версия обоих.Чтобы сделать вещи немного сложнее, каждая версия имеет также цель отладки и выпуска.Таким образом, всего четыре цели сборки:
- Версия 1 DEBUG, построенная с
-DVERSION1 -DDEBUG
- Версия 1 RELEASE, построенная с
-DVERSION1 -DRELEASE
- Версия 2DEBUG, собранный с
-DVERSION2 -DDEBUG
- Версия 2 RELEASE, собранный с
-DVERSION2 -DRELEASE
Итак, наш make-файл, который мы используем в VS Code, является настройкой, в которой мы также можем выбратьпостроить цель и правильные версии построены.Пока все хорошо.
Теперь в игру вступают C / C ++ - Extension и IntelliSense.Они используют clang для «компиляции» кода на лету для автоматического завершения и выделения участков кода, которые фактически используются.Поскольку наши #define
s (VERSION1 или VERSION2) для разных версий предоставляются только компилятору gcc в make-файле, clang не знает о них.Не зная их, разделы кода отображаются серым цветом (что не так уж и сложно), но также автоматическое завершение не работает для переменных, которые могут быть объявлены в таком разделе.
Конечно, мыможете указать определения в c_cpp_properties.json
, а также сделать различные цели сборки там.Но это будет означать, что нам нужно переключаться между целями сборки дважды: сначала для расширения C / C ++, а затем для make-файла.Я почти уверен, что люди забудут одно или другое и будут разочарованы.
Короче говоря: есть ли способ переключения целей сборки в коде Visual Studio, которые влияют как на IntelliSense, так и на фактическую сборку?