Новые возможности для C++ в Visual Studio 2022

В Visual Studio 2022 реализовано множество обновлений и исправлений для среды Microsoft C++. Мы добавили новые функции и исправили множество ошибок и проблем с компилятором и инструментами. Visual Studio IDE также предлагает значительные улучшения производительности и продуктивности и теперь работает в виде собственного 64-разрядного приложения. Дополнительные сведения о новых возможностях всех компонентов Visual Studio см. на странице Новые возможности Visual Studio 2022. Сведения об изменениях в документации по C++ см. в разделе Документация по C++: новое.

Новые возможности C++ в Visual Studio версии 17.1

Сводку о новых возможностях и исправлениях ошибок в Visual Studio см. в статье Новые возможности Visual Studio 2022 версии 17.1.

  • Добавлен новый шаблон предустановки конфигурации для настройки и сборки проектов CMake на удаленной системе macOS с помощью CMakePresets.json. Можно также запустить целевые объекты CMake на удаленной системе macOS, а затем выполнить удаленную отладку в отладчике Visual Studio с подключением GDB или LLDB.

  • Теперь можно выполнить отладку дампов ядра на удаленной системе macOS из Visual Studio с помощью LLDB или GDB.

  • Версии Clang и LLVM, поставляемые с Visual Studio, обновлены до версии 13.

  • Интеграция Visual Studio с CMake активна, только когда CMakeLists.txt определяется в корне открытой рабочей области. Если CMakeLists.txt определяется на другом уровне рабочей области, появится уведомление, предлагающее активировать интеграцию Visual Studio с CMake.

  • Добавлено новое окно визуализации регистра внедренных целевых объектов, доступное в меню Отладка>Окна>Внедренные регистры.

  • Добавлено новое представление цепочек для проектов ОСРВ, доступное в меню Отладка>Окна>Объекты ОСРВ.

Новые возможности C++ в Visual Studio версии 17.0

Сводку о новых возможностях и исправлениях ошибок в Visual Studio см. в статье Новые возможности Visual Studio 2022 версии 17.0.

  • Visual Studio IDE, devenv.exe , теперь является собственным 64-разрядным приложением.

  • Набор инструментов MSVC теперь по умолчанию используется для хэширования источника SHA-256 в отладочных записях. Ранее набор инструментов использовал MD5 для хэширования источника по умолчанию.

  • Средства сборки версии 143 теперь доступны благодаря установщику Visual Studio, а также в автономных средствах сборки.

Горячая перезагрузка для машинного кода C++

  • Горячая перезагрузка для C++ позволяет вносить в выполняемое приложение изменения кода разных типов и применять их без необходимости приостанавливать его с помощью точки останова или аналогичного средства.

В Visual Studio 2022 при запуске приложения в отладчике можно использовать кнопку горячей перезагрузки для внесения изменений во время выполнения приложения. Этот интерфейс работает на основе собственного режима "Изменить и продолжить". Дополнительные сведения о поддерживаемых изменениях см. по ссылке Изменить и продолжить (C++).

  • Горячая перезагрузка теперь поддерживает проекты CMake и OpenFolder.

Поддержка WSL2

  • Теперь вы можете выполнять сборку и отладку собственного кода в WSL2 без установления SSH-подключения. Поддерживаются кросс-платформенные проекты CMake и проекты Linux на основе MSBuild.

Улучшенная поддержка CMake

  • Мы обновили версию CMake, поставляемую с Visual Studio, до версии 3.21. Дополнительные сведения о доступных функциях этой версии см. в заметках о выпуске CMake 3.21.

  • Обновлены страницы обзора CMake для поддержки CMakePresets.json .

  • Теперь вы можете настраивать проекты CMake и выполнять их сборку с помощью CMake 3.21 и CMakePresets.json версии 3.

  • Visual Studio теперь поддерживает параметр buildPresets.targets в CMakePresets.json . Он позволяет создать набор целевых объектов в проекте CMake.

  • Меню "Проект" в проектах CMake упрощено и предоставляет варианты "Удалить кэш и изменить конфигурацию" и "Просмотреть кэш".

  • Реализован параметр компилятора /scanDependencies для перечислений зависимостей модуля C++20 в проектах CMake, как описано в P1689R4. Это шаг к поддержке создания проектов на основе модулей с помощью CMake, и мы работаем над реализацией этой поддержки в последующих выпусках.

Улучшения стандартной библиотеки

Здесь выделены улучшения стандартной библиотеки (STL). Полный список новых функций, изменений, исправлений ошибок и улучшений производительности см. в журнале изменений команды STL.

  • Добавлены визуализаторы отладки для улучшения отображения следующих типов: source_location, bind_front(), u8string (и его итераторы), default_sentinel_t, unreachable_sentinel_t, ranges::empty_view, ranges::single_view, ranges::iota_view (и его итератор или граничная метка), ranges::ref_view, thread, thread::id, jthread и filesystem::path.
  • Добавлен [[nodiscard]] в семейство функций stoi() в <string> и в различные функции в <locale>, такие как функции-члены collate, has_facet() и семейства isalnum() и tolower().
  • P0980R1 Создан std::stringconstexpr в VS 2019 версии 16.10. Теперь он также поддерживается для Clang.
  • P1004R2 Создан std::vectorconstexpr в VS 2019 версии 16.10. Теперь он также поддерживается для Clang.

Выделенные функции C++23

  • P1048R1 Добавлен is_scoped_enum, новый признак для стандартной библиотеки C++, который определяет, является ли тип ограниченным перечислением.
  • P1132R7out_ptr(), inout_ptr()
  • P1679R3contains() для basic_string и basic_string_view
  • P1682R3to_underlying() для перечислений
  • P2162R2 Разрешено наследование от std::variant.
  • P2166R1 Запрещено создание basic_string и basic_string_view из nullptr. Это критическое изменение исходного кода. Код с ранее неопределенным поведением в среде выполнения теперь отклоняется с ошибками компилятора.
  • P2186R2 Удалена поддержка сборки мусора. Это изменение удаляет declare_reachable, undeclare_reachable, declare_no_pointers, undeclare_no_pointers, get_pointer_safety. Ранее эти функции не действовали.

Выделенные улучшения производительности

  • <format> теперь определяет, когда идет запись в back_insert_iterator для basic_string или vector, и быстрее вызывает insert() в end() контейнера.
  • Улучшена производительность std::find() и std::count() для vector<bool> в 19 и 26 раз (не на соответствующее число процентов).
  • Улучшена производительность std::count() для vector<bool>.
  • Производительность std::byte теперь такая же, как у unsigned char в reverse() и variant::swap().

Поддержка Clang и LLVM

  • Средства LLVM, поставляемые с Visual Studio, были обновлены до LLVM 12. Дополнительные сведения см. в заметках о выпуске LLVM.

  • Поддержка Clang-cl была обновлена до LLVM 12.

  • Теперь вы можете выполнять отладку процессов, работающих на удаленных системах из Visual Studio, с помощью LLDB.

C++ AMP не рекомендуется

  • Заголовки C++ AMP теперь являются нерекомендуемыми. Включение <amp.h> в проект C++ приводит к возникновению ошибок сборки. Чтобы заглушить эти ошибки, определите _SILENCE_AMP_DEPRECATION_WARNINGS. Дополнительные сведения см. по ссылкам об объявлении AMP нерекомендуемым.

Улучшения IntelliSense

  • Внесены улучшения в IntelliSense для C++, касающиеся навигации и выделения синтаксиса в типах из импортированных модулей и блоков заголовков. IntelliSense — это активная область вложений для нас. Помогите нам стать лучше: поделитесь своим отзывом в сообществе разработчиков, перейдя в меню Справка>Отправить отзыв.

  • Улучшена производительность IntelliSense для C++ за счет оптимизации использования кэшированных заголовков и доступа к базе данных символов, что позволило уменьшить время загрузки для перехода к коду.

  • Анализатор кода IntelliSense для C++ теперь включен по умолчанию. Он выдает мгновенные предложения во время ввода, а также предложения по исправлению для распространенных ошибок в коде.

  • C++ IntelliSense для проектов CMake теперь работает при использовании заготовки с отображаемым именем.

Обновления рабочей нагрузки C++

  • В рабочей нагрузке Разработка мобильных приложений на языке C++ произведено обновление до пакета NDK r21 LTS.

  • Рабочая нагрузка Разработка игр на языке C++ теперь устанавливает последний Unreal Engine с поддержкой Visual Studio 2022.

Улучшения анализа кода

  • Анализ кода теперь обеспечивает принудительную проверку возвращаемых значений функций с аннотациями _Check_return_ или _Must_inspect_result_.

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

  • Добавлена поддержка gsl::not_null для анализа кода.

  • Поддержка libFuzzer с параметром компилятора /fsanitize=fuzzer .

Заметки о выпусках более ранних версий

Также доступны заметки о выпусках более ранних версий C++. Сведения о новых возможностях C++ в Visual Studio 2019 см в статье Новые возможности C++ в Visual Studio 2019. Сведения о новых возможностях C++ в Visual Studio 2017 см в статье Новые возможности C++ в Visual Studio 2017. Сведения о новых возможностях в более ранних версиях см. в статье Visual C++. Новые возможности в версиях с 2003 по 2015.

Известные проблемы

C++ IntelliSense

Дополнительные сведения о других открытых проблемах и доступных решениях для C++ в Visual Studio 2022 см. в списке проблем для сообщества разработчиков C++.

Отзывы и предложения

Будем рады узнать ваше мнение! Вы можете сообщить о проблеме или предложить функцию с помощью значка "Отправить отзыв" в правом верхнем углу установщика или Visual Studio IDE или в меню Справка>Отправить отзыв. Вы можете отслеживать проблемы в сообществе разработчиков Visual Studio, позволяющем добавлять комментарии или искать решения. Кроме того, вам доступна бесплатная поддержка в чате по вопросам с установкой.

Блоги

Воспользуйтесь аналитикой и рекомендациями, доступными на сайте Microsoft Developer Blogs (Блоги разработчиков Майкрософт). Они будут держать вас в курсе всех новых выпусков. В блогах можно найти записи, подробно изучающие разнообразные функции. Вам непременно понравятся C++ Team Blog (блог команды разработчиков C++) и Visual Studio Blog (блог Visual Studio).