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

В Visual Studio 2019 реализовано множество изменений и исправлений для среды Microsoft C++. Мы исправили множество ошибок и проблем с компилятором и средствами. Сообщения о многих из них были отправлены клиентами с помощью инструментов Сообщить о проблеме и Отправить предложение в разделе Отправить отзыв. Спасибо, что сообщаете нам об ошибках!

Дополнительные сведения о новых возможностях всех компонентов Visual Studio см. на странице What's new in Visual Studio 2019 (Новые возможности Visual Studio 2019). Сведения о новых возможностях C++ в Visual Studio 2017 см. в статье Новые возможности C++ в Visual Studio 2017. Сведения о новых возможностях для C++ в Visual Studio 2015 и более ранних версиях см. в статье Visual C++ What's New 2003 through 2015 (Новые возможности Visual C++ в версиях с 2003 по 2015).

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

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

  • Теперь компилятор поддерживает /std:c++20 режим компилятора. Ранее функции C++20 были доступны только в /std:c++latest режиме в Visual Studio 2019. Функции, изначально требовавшие включения режима /std:c++latest, теперь работают в режиме /std:c++20 или более поздних версий в последних версиях Visual Studio.

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

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

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

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

  • Все функции C++20 теперь доступны в режиме /std:c++latest. Хотя реализация MSVC стандартов C++20 (как опубликовано в настоящее время ISO) завершена, ожидается, что некоторые ключевые функции библиотеки C++20 будут изменены предстоящими отчетами об ошибках (исправления ошибок ISO C++20), которые могут привести к изменениям, несовместимым с ABI. Дополнительные сведения см. в разделе Проблема Майкрософт/STL 1814.

    • В версии 16.10 добавлена поддержка немедленных функций и constinit C++20.
    • Заключительные части <chrono>: новые часы, високосные секунды, часовые пояса и разбор.
    • Реализация <format> для форматирования текста.
  • /openmp:llvm теперь доступен на процессорах x86 и ARM64 в дополнение к x64.

  • Включаемые директории теперь могут назначаться внешними с настроенными уровнями предупреждений компиляции и параметрами анализа кода.

  • Добавлен параметр /await:strict для включения сопрограмм в стиле C++20 в более ранних языковых режимах.

  • Визуализация отладчика std::coroutine_handle<T> теперь отображает имя и сигнатуру исходной функции сопрограммы, а также актуальную точку приостановки.

  • Добавлена поддержка для CMakePresets.

  • Теперь при добавлении нового удаленного подключения в Visual Studio вам потребуется принять или отклонить отпечаток ключа узла, представленный сервером.

  • Добавлен параметр /external в MSVC для указания заголовков, которые в целях вывода предупреждений должны обрабатываться как внешние.

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

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

  • AddressSanitizer:

    • Поддержка санитайзера адресов в Windows вышла из экспериментального режима и теперь общедоступна.

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

    • Добавлена поддержка устаревшего семейства функций работы с памятью GlobalAlloc и LocalAlloc. Вы можете включить эти перехватчики, установив флаг среды ASAN_OPTIONS=windows_hook_legacy_allocators=true.

    • Обновлены сообщения об ошибках, связанные с пересечением теневой памяти и сбоями перехвата, чтобы предоставлять четкие сведения о проблемах и методах решения.

    • Интеграция с интегрированной средой разработки теперь поддерживает полную коллекцию исключений, о которых может сообщать ASan.

    • Компилятор и компоновщик предложат сгенерировать отладочную информацию, если обнаружат, что сборка выполняется с использованием ASan, но отладочная информация не генерируется.

  • Теперь вы можете нацелиться на версию LLVM среды выполнения OpenMP с помощью нового параметра компилятора /openmp:llvm. Это добавляет поддержку конструкции lastprivate, используемой в разделах #pragma omp, и беззнаковых индексных переменных в параллельных циклах for. Параметр /openmp:llvm в настоящее время доступен только для целевой платформы amd64 и считается экспериментальным.

  • Для проектов Visual Studio CMake теперь предоставляется первоклассная поддержка удаленной разработки Windows. Сюда включается настройка проекта CMake для целевой платформы Windows ARM64, развертывание проекта на удаленном компьютере Windows и его отладка на удаленном компьютере Windows из Visual Studio.

  • Версия Ninja, поставляемая с Visual Studio в Windows, была обновлена до 1.10. Дополнительные сведения о включенных возможностях см. в заметках о выпуске Ninja 1.10.

  • Версия CMake, поставляемая с Visual Studio, была обновлена до 3.19. Дополнительные сведения о включенных возможностях см. в заметках о выпуске CMake 3.19.

  • В библиотеке STL многие типы блокировок и защитных механизмов помечены как nodiscard.

  • IntelliSense.

  • MSVC теперь определяет правильные среды выполнения для санитайзера адресов, необходимые для двоичных файлов. Проект Visual Studio автоматически получит новые изменения. При использовании санитайзера адресов в командной строке теперь необходимо передать компилятору только /fsanitize=address.

  • Диспетчер соединений Visual Studio теперь поддерживает закрытые ключи с помощью алгоритма открытого ключа ECDSA.

  • LLVM и Clang, поставляемые в нашем установщике, обновлены до версии 11. Дополнительные сведения см. в заметках о выпуске для LLVM и Clang.

  • Теперь Visual Studio будет использовать переменные CMake из файлов цепочки инструментов для настройки IntelliSense. Это обеспечит лучшую производительность при разработке встраиваемых приложений и Android.

  • Реализация предложения о дополнительных контейнерах constexpr, которая позволяет деструкторам и новым выражениям представлять constexpr. Это создает условия для использования таких служебных программ, как constexprstd::vector и std::string.

  • Расширенная поддержка IntelliSense для модулей C++20, включая переход к определению, переход к модулю и завершение элементов.

  • Сокращенные шаблоны функций теперь поддерживаются в компиляторе MSVC.

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

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

  • Сопрограммы C++20 теперь поддерживаются в режиме /std:c++latest (или /std:c++20 начиная с Visual Studio 2019 версии 16.11) и заголовке <coroutine>.

  • Теперь технология IntelliSense обеспечивает поддержку заголовков C++20 <concepts> и <ranges>, а также переименование и просмотр определений концепций.

  • Наша версия библиотеки STL теперь поддерживает большинство диапазонов C++20.

  • Компилятор MSVC теперь поддерживает специальные функции-члены, условно являющиеся тривиальными.

  • C11 и C17 теперь поддерживаются при использовании /std:c11 и /std:c17 переключателей.

  • Внедрены также такие дополнительные улучшения STL, как полная поддержка std::atomic_ref, std::midpoint, std::lerp и std::execution::unseq, оптимизации для std::reverse_copy и многое другое.

  • Обновленная версия CMake, поставляемая с Visual Studio, была обновлена до версии CMake 3.18.

  • Наши средства анализа кода теперь поддерживают SARIF 2.1 — отраслевой стандартный формат журнала статического анализа.

  • Отсутствующие средства сборки в проектах Linux теперь будут вызывать предупреждение на панели инструментов и четкое описание отсутствующих средств в списке ошибок.

  • Теперь можно выполнять отладку дампов ядра Linux в удаленной системе Linux или WSL непосредственно из Visual Studio.

  • Для создания комментариев в C++ Doxygen мы добавили дополнительные варианты стиля комментариев (/*! и //!).

  • Дополнительные объявления о vcpkg.

  • Включена поддержка компилятора для лямбда-выражений в невычисляемых контекстах.

  • Повышена производительность ссылки /DEBUG:FULL путем создания PDB-файлов в многопоточном режиме. Для некоторых крупных приложений и AAA-игр компоновка выполняется в 2–4 раза быстрее.

  • Отладчик Visual Studio теперь поддерживает char8_t.

  • Включена поддержка проектов ARM64 с использованием clang-cl.

  • Включена поддержка встроенных объектов Intel AMX.

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

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

  • Теперь в рамках удаленной поддержки C++ поддерживается более широкий набор дистрибутивов и оболочек Linux, включая sh, csh, bash, tsch, ksh, zsh и dash. Можно переопределить возможность выбора оболочки для удаленного подключения, изменив свойство новой оболочки с помощью ConnectionManager.exe. Эта поддержка была протестирована в проектах Linux на основе MSBuild и проектах CMake, предназначенных для удаленной системы Linux или WSL.

  • Теперь вы можете использовать Ninja (систему сборки, которая очень быстро оценивает добавочные сборки) для оптимизации времени добавочной сборки для проектов Linux на основе MSBuild. Чтобы включить эту функцию, задайте параметру "Включить добавочную сборку" значение "С Ninja" на странице свойств "Общие". Система Ninja (ninja-build) должна быть установлена в удаленной системе Linux или WSL.

  • Реализованы новые функции стандартной библиотеки C++ 20. Подробный список см. в журнале изменений STL на GitHub.

  • Теперь можно изменять удаленные подключения SSH и задавать удаленные подключения SSH по умолчанию в диспетчере подключений. Это означает, что можно изменить существующее удаленное подключение (например, если изменился его IP-адрес) и задать используемые по умолчанию подключения в файлах CMakeSettings.json и launch.vs.json. Удаленные подключения SSH позволяют создавать и отлаживать проекты C++ в удаленной системе Linux непосредственно из Visual Studio.

  • Улучшенная поддержка IntelliSense для Clang в Windows (clang-cl) в Visual Studio. Теперь путь включения clang содержит библиотеки clang, мы улучшили отображение волнистых линий в редакторе при использовании библиотеки std, а также добавили поддержку языка C++2a в режиме clang.

  • Теперь вы можете использовать функцию подчеркивания ошибок в коде и просматривать другие предлагаемые быстрые исправления в проектах C++. Включите эту функцию в разделе Сервис > Параметры > Текстовый редактор > C/C++ > Экспериментальное. Установите для параметра Disable Experimental Code Linter значение false. Дополнительные сведения см. в Блоге группы разработчиков C++.

  • Мы добавили четыре новых правила анализа кода для включения дополнительных функций безопасности в C++: C26817, C26818, C26819 и C26820.

  • Мы добавили превосходную поддержку отладки проектов CMake в удаленных системах с помощью gdbserver.

  • Вы сможете легко находить ошибки повреждения памяти с помощью экспериментальной реализации AddressSanitizer для C++ в Visual Studio, которая теперь доступна для собственных проектов x64. Также поддерживаются среды выполнения отладки (/MTd, /MDd, /LDd).

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

  • Файлы с расширением .ixx и .cppm теперь распознаются как файлы C++ и обрабатываются как таковые с использованием маркера синтаксиса и технологии IntelliSense.

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

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

  • Улучшено создание комментариев Doxygen/XML: Автоматически создаются заглушки для комментариев Doxygen или XML при вводе /// или /** над функциями. Теперь они также отображаются в подсказках с краткими сведениями.

  • Поддержка Ninja для CMake для Linux/WSL: используйте Ninja в качестве базового генератора при создании проектов CMake в WSL или удаленной системе. Ninja теперь является генератором по умолчанию при добавлении новой конфигурации Linux или WSL.

  • Шаблоны для удаленной отладки CMake: мы упростили шаблоны для отладки проектов CMake на удаленной системе Linux или WSL с использованием gdb.

  • Начальная поддержка концепций C++20: IntelliSense теперь распознает основные понятия C++20 и предлагает их в списке участников.

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

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

  • Поддержка модели автозавершения команд IntelliCode и членов-переменных. Разработчики C++ теперь могут обучать модели IntelliCode по собственным базам кода. Мы называем это моделью завершений команды, потому что вы извлекаете выгоду из практик вашей команды. Кроме того, мы улучшили предложения IntelliCode для переменных-членов.

  • Улучшения IntelliSense:

    • IntelliSense теперь отображает более читаемые имена типов при работе со стандартной библиотекой.
    • Мы добавили возможность переключения, будет ли клавиши Enter, пробел и Tab использоваться в качестве символов фиксации, а также возможность переключения, будет ли клавиша Tab использоваться для вставки фрагмента кода. Эти параметры расположены в разделе Сервис > Параметры > Текстовый редактор > C/C++ > Дополнительно > IntelliSense.
  • Работа с диспетчером подключений через командную строку. Теперь вы можете взаимодействовать с сохраненными удаленными подключениями через командную строку. Это удобно для таких задач, как подготовка нового компьютера для разработки или настройка Visual Studio в непрерывной интеграции.

  • Отладка и развертывание для WSL. Используйте встроенную поддержку WSL в Visual Studio, чтобы отделить систему сборки от системы удаленного развертывания. Теперь вы можете создавать собственные компоненты на WSL и развертывать артефакты сборки во второй удаленной системе для отладки. Этот рабочий процесс поддерживается как проектами CMake, так и проектами Linux на основе MSBuild.

  • Поддержка режима соответствия FIPS 140-2. Теперь Visual Studio поддерживает режим соответствия FIPS 140-2 при разработке приложений на C++, предназначенных для удаленной системы Linux.

  • Языковые службы для файлов языка CMake и более эффективное управление проектом CMake:

    • Оптимизирован процесс копирования исходных файлов для проектов CMake, нацеленных на удаленную систему Linux. Visual Studio теперь сохраняет файл отпечатка последнего набора источников, скопированного удаленно, и оптимизирует поведение в зависимости от количества измененных файлов.

    • Функции навигации по коду, такие как переход к определению и поиску всех ссылок, теперь поддерживаются для функций, переменных и целевых объектов в файлах скриптов CMake.

    • Добавляйте, удаляйте и переименовывайте исходные файлы и целевые объекты в проектах CMake из IDE без изменения скриптов CMake вручную. При добавлении или удалении файлов с помощью обозревателя решений Visual Studio автоматически отредактирует проект CMake. Кроме того, можно добавлять, удалять и переименовывать целевые объекты проекта из представления целевых объектов обозревателя решений.

  • Улучшения для проектов Linux. Проекты Visual Studio Linux получили более точную функцию IntelliSense. Это позволяет управлять синхронизацией удаленных заголовков отдельно для каждого проекта.

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

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

  • В Code Analysis реализована встроенная поддержка средства Clang-Tidy для проектов MSBuild и CMake при использовании набора инструментов MSVC или Clang. Проверки clang-tidy могут выполняться в рамках анализа кода в фоновом режиме, результаты появляются как предупреждения в редакторе (в виде подчёркиваний) и отображаются в списке ошибок.

  • Теперь у проектов Visual Studio CMake есть обзорные страницы, которые помогут приступить к работе с кросс-платформенной разработкой. Эти страницы являются динамическими и помогают подключиться к системе Linux и добавить конфигурацию Linux или WSL в проект CMake.

  • Раскрывающееся меню запуска для проектов CMake теперь отображает последние использованные целевые объекты и может быть отфильтровано.

  • C++/CLI теперь поддерживает взаимодействие с .NET Core 3.1 и более поздними версиями в Windows.

  • Теперь можно включить ASan для проектов, скомпилированных с помощью MSVC в Windows, для инструментирования кода C++ в среде выполнения, чтобы обнаруживать ошибки памяти.

  • Обновления стандартной библиотеки C++ MSVC:

    • C++17: Реализована универсальная точность to_chars(), завершение P0067R5 Преобразования элементарных строк (charconv). Это завершает реализацию всех функций библиотеки в C++ 17 Standard.
    • C++20: реализована P1754R1: переименование концептов в standard_case. Чтобы включить эти возможности, используйте параметр компилятора /std:c++latest (или /std:c++20 начиная с Visual Studio 2019 версии 16.11). Этот параметр также можно задать на странице свойств проекта (Свойства конфигурации > C/C++ > Язык) с помощью свойства Стандарт языка C++.
  • Теперь доступна новая коллекция средств C++ Build Insights. Дополнительные сведения об объявлении см. в блоге группы разработчиков C++.

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

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

  • Теперь разработчики C++ могут переключать комментарии строк с помощью сочетания клавиш CTRL + K, CTRL + /.

  • Списки элементов IntelliSense теперь отфильтрованы на основе квалификаторов типа, например const std::vector теперь отфильтровывает такие методы, как push_back.

  • Мы добавили эти возможности стандартной библиотеки C++20 (доступны в /std:c++latest или /std:c++20 начиная с Visual Studio 2019 версии 16.11):

    • P0487R1: исправление operator>>(basic_istream&, CharT*)
    • P0616R0: использование move() в <numeric>
    • P0758R1: is_nothrow_convertible
    • P0734R0: расширения C++ для концепций
    • P0898R3: основные понятия стандартной библиотеки
    • P0919R3: разнородный поиск неупорядоченных контейнеров
  • Новые проверки рекомендаций C++ Core Guidelines, включая новый набор правил "Enum Rules" и дополнительные правила для const, enum и типов.

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

  • Для настройки целевых объектов отладки и пользовательских задач с переменными среды можно использовать файлы CMakeSettings.json или CppProperties.json, а также новый тег "env" для отдельных целевых объектов и задач в файлах launch.vs.json и tasks.vs.json.

  • Теперь с помощью быстрого действия для отсутствующих пакетов vcpkg пользователи могут автоматически открывать консоль и устанавливать заданную по умолчанию версию пакета vcpkg.

  • Оптимизирована функция копирования удаленного заголовка для проектов Linux (CMake и MSBuild), которая теперь может выполняться параллельно.

  • Собственная поддержка WSL в Visual Studio теперь также включает поддержку параллельных сборок для проектов Linux на основе MSBuild.

  • Теперь пользователь может указать список локальных результатов сборки, которые будут развертываться в удаленной системе с проектами Makefile в Linux.

  • Описание параметров в редакторе параметров CMake теперь содержит больше контекстной информации и дополнительные ссылки на полезную документацию.

  • Базовая модель C++ для IntelliCode теперь включена по умолчанию. Чтобы изменить этот параметр, последовательно выберите Сервис>Параметры>IntelliCode.

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

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

  • Для локальных проектов CMake, настроенных с использованием Clang, анализ кода теперь выполняет проверки с помощью инструмента clang-tidy. Эти проверки отображаются как предупреждения в редакторе (волнистое подчеркивание) и в Списке ошибок в рамках анализа кода, выполняемого в фоновом режиме.

  • Обновлен заголовок <charconv> для P0067R5 (элементарные преобразования строк) в C++17.

    • Добавлены перегрузки с плавающей точкой для to_chars() с точностью chars_format::fixed и chars_format::scientific (единственная часть, еще не реализованная, — chars_format::general precision).
    • Произведена оптимизация chars_format::fixed кратчайшего.
  • Добавлены следующие возможности стандартной библиотеки C++20:

    • Доступно под /std:c++latest (или /std:c++20, начиная с версии 16.11 Visual Studio 2019):
      • P0020R6 — atomic<floating-point>.
      • P0463R1: перечисление endian
      • P0482R6 — char8_t тип для символов и строк UTF-8.
      • P0653R2 — to_address() для преобразования указателя в необработанный указатель.
    • Доступно в /std:c++17 и /std:c++latest (или в /std:c++20, начиная с версии 16.11 Visual Studio 2019):
      • P0600R1 — [[nodiscard]] в библиотеке.
    • Доступно безоговорочно:
      • P0754R2 — заголовок <version>.
      • P0771R1 — конструктор переноса std::function должен быть noexcept.
  • Windows SDK больше не является зависимостью для компонентов CMake для Windows и CMake для Linux.

  • Усовершенствования компоновщика C++ для значительного сокращения времени сборки итераций для самых крупных входных данных. Время выполнения /DEBUG:FAST и /INCREMENTAL в среднем вдвое быстрее, а /DEBUG:FULL теперь в три-шесть раз быстрее.

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

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

Компилятор C++.

  • В компиляторе C++ были реализованы следующие возможности C++20, доступные в /std:c++latest (или /std:c++20 начиная с Visual Studio 2019 версии 16.11):

    • улучшена возможность поиска шаблонов функций с помощью зависящего от аргументов поиска выражений вызова функции с явно заданными аргументами шаблона (P0846R0);
    • Инициализация с назначением (P0329R4), которая позволяет выбирать определенные члены в агрегатной инициализации, например, с использованием синтаксиса Type t { .member = expr }.
  • Полностью переработана поддержка лямбда-функций и устранено большое количество давних проблем. При использовании /std:c++20 или /std:c++latest это изменение включено по умолчанию. В языковом режиме /std:c++17 и в режиме по умолчанию (/std:c++14) новое средство синтаксического анализа можно включить с помощью /Zc:lambda в Visual Studio 2019 версии 16.9 или более поздней (ранее доступны в /experimental:newLambdaProcessor начиная с Visual Studio 2019 версии 16.3), например /std:c++17 /Zc:lambda.

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

  • Эти функции C++20 были добавлены в нашу реализацию стандартной библиотеки C++, доступной в разделе /std:c++latest:
    • starts_with и ends_with для basic_string и basic_string_view.
    • contains для ассоциативных контейнеров;
    • remove, remove_if и unique для list и forward_list теперь возвращают size_type;
    • shift_leftи shift_right добавлены в <algorithm>.

IDE C++

IntelliCode для C++

IntelliCode теперь предоставляется в виде дополнительного компонента в комплекте Разработка для рабочего стола на C++. Подробные сведения см. в записи блога Improved C++ IntelliCode now Ships with Visual Studio 2019 (Улучшенный компонент IntelliCode для C++ теперь предоставляется с Visual Studio 2019).

IntelliCode использует обучение и контекст кода для вывода тех вариантов, которые вы чаще всего используете, в верхней части списка завершения. Он также часто устраняет необходимость прокручивать список. IntelliCode для C++ работает наиболее эффективно при использовании популярных библиотек, таких как стандартная библиотека.

Новые функции IntelliCode (пользовательские модели, поддержка C++ и вывод конфигураций EditorConfig) отключены по умолчанию. Чтобы включить их, откройте меню Средства > Параметры > IntelliCode > Общие. В этой версии IntelliCode повышен уровень точности и включена поддержка бесплатных функций. Дополнительные сведения см. в разделе Рекомендации по завершению кода на базе ИИ в C++ через IntelliCode.

Улучшение быстрой информации

  • В информационной подсказке теперь учитывается семантическая подсветка в вашем редакторе. Он также имеет новую ссылку Поиск в Интернете, которая будет искать онлайн-документацию о конструкции кода при наведении курсора. Для кода, подчеркнутого волнистой красной линией, ссылка в подсказке позволяет выполнить поиск сведений об ошибке в Интернете. То есть вам не придется повторно вводить сообщение в браузере. Дополнительные сведения см. в разделе "Краткие сведения" в Visual Studio 2019: цветизация и поиск в Интернете.

Общие улучшения

  • Панель шаблонов может заполнять выпадающее меню на основе экземпляров шаблона в вашей кодовой базе.

  • Лампочки для отсутствующих директив #include, которые могут быть установлены с помощью vcpkg, и автозавершение доступных пакетов для директивы CMake find_package.

  • Изменена страница свойств Общие для проектов C++. Некоторые параметры теперь отображаются на новой странице Дополнительно. На странице Дополнительно также находятся новые свойства для предпочитаемой архитектуры набора инструментов, отладочных библиотек, дополнительного номера версии набора инструментов MSVC и сборок Unity (джамбо).

Поддержка CMake

  • Версия CMake, которая поставляется с Visual Studio, обновлена до версии 3.14. В этой версии появилась встроенная поддержка генераторов MSBuild, предназначенных для проектов Visual Studio 2019, а также API интеграции интегрированной среды разработки на основе файлов.

  • Мы добавили улучшения в редактор параметров CMake, включая поддержку подсистемы Windows для Linux (WSL) и конфигураций из существующих кэшей, изменения корневых каталогов сборки и установки по умолчанию, а также поддержку переменных среды в конфигурациях CMake для Linux.

  • Завершения и краткие сведения для встроенных команд, переменных и свойств CMake упрощают редактирование файлов CMakeLists.txt.

  • Встроенная поддержка редактирования, сборки и отладки проектов CMake с Clang/LLVM. Подробные сведения см. в записи блога Clang/LLVM Support in Visual Studio (Поддержка Clang/LLVM в Visual Studio).

Linux и подсистема Windows для Linux.

  • Теперь поддерживается AddressSanitizer (ASan) в Linux и кроссплатформенных проектах CMake. Подробные сведения см. в записи блога AddressSanitizer (ASan) for the Linux Workload in Visual Studio 2019 (AddressSanitizer (ASan) для рабочей нагрузки Linux в Visual Studio 2019).

  • Мы интегрировали поддержку Visual Studio для работы с подсистемой Windows для Linux (WSL) при использовании C++. Теперь можно использовать локальную подсистему Windows для Linux (WSL) с C++ нативно в Visual Studio без дополнительной настройки или SSH-подключения. Подробные сведения см. в записи блога C++ with Visual Studio 2019 and Windows Subsystem for Linux (WSL) (C++ с Visual Studio 2019 и подсистемой Windows для Linux (WSL)).

Анализ кода

Удаленные сборки

  • Теперь при разработке для Linux можно изолировать компьютеры удаленной сборки от компьютеров удаленной отладки (доступно для проектов MSBuild и CMake).

  • Улучшенное ведение журнала для удаленных подключений упрощает диагностику проблем, связанных с кроссплатформенной разработкой.

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

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

Компилятор C++.

  • Улучшенная поддержка функций C++17 и корректирующие исправления, а также экспериментальная поддержка функций C++20, таких как модули и сопрограммы. Подробные сведения см. в статье Улучшения соответствия C++ в Visual Studio 2019.

  • Параметр /std:c++latest теперь поддерживает функции C++20, которые не обязательно завершены, включая начальную поддержку оператора C++20 <=> ("космический корабль") для трехстороннего сравнения.

  • Параметр компилятора C++ /Gm теперь считается устаревшим. Рекомендуется отключить параметр /Gm в скриптах сборки, если он задан явно. Можно просто проигнорировать предупреждение об устаревании /Gm, так как оно не считается ошибкой при использовании режима "Обрабатывать предупреждения как ошибки" (/WX).

  • В MSVC уже внедряются функции из проекта стандарта C++20 с флагом /std:c++latest, поэтому /std:c++latest теперь несовместим с /clr (все варианты), /ZW и /Gm. В Visual Studio 2019 используйте режим /std:c++17 или /std:c++14 при компиляции с параметром /clr, /ZW или /Gm (но обратите внимание на предыдущий пункт).

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

Генерация кода, безопасность, диагностика и версирование

Доступен параметр /Qspectre для более эффективного анализа и устранения рисков, связанных с уязвимостью Spectre 1-го варианта (CVE-2017-5753). Дополнительные сведения см. в разделе Смягчение последствий Spectre в MSVC.

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

  • Реализация дополнительных функций библиотек и корректирующих исправлений C++17 и C++20. Подробные сведения см. в статье Улучшения соответствия C++ в Visual Studio 2019.

  • Для улучшения читаемости кода в заголовках стандартной библиотеки C++ используется Clang-Format.

  • Так как Visual Studio теперь поддерживает функцию "Только мой код" для C++, стандартная библиотека больше не должна предоставлять настраиваемый механизм для std::function и std::visit, чтобы обеспечить такой же результат. Удаление этого механизма будет почти незаметным для пользователя. Одно исключение: компилятор больше не будет сообщать о наличии проблем в строках 15732480 и 16707566 для <type_traits> или <variant>.

Повышение производительности и пропускной способности в компиляторе и стандартной библиотеке

  • Реализованы усовершенствования увеличения скорости процесса сборки, включая улучшения в обработке ввода-вывода файлов компоновщиком и время на стадии компоновки при объединении и создании типов PDB.

  • Добавлена базовая поддержка векторизации OpenMP SIMD. Вы можете включить ее с помощью нового параметра компилятора /openmp:experimental. Эта опция позволяет при необходимости векторизовать циклы, аннотированные с #pragma omp simd. Векторизация не гарантируется, и для циклов с аннотацией, но без векторизации, будет выдано предупреждение. Предложения SIMD не поддерживаются: они игнорируются, и выводится предупреждение.

  • Добавлен новый параметр встраивания командной строки /Ob3, который представляет собой более эффективную версию /Ob2. /O2 (оптимизация двоичного файла для скорости) по-прежнему подразумевает /Ob2 по умолчанию. Если вы считаете, что компилятор недостаточно агрессивно выполняет встраивание, попробуйте передать /O2 -Ob3.

  • Добавлена поддержка встроенных функций Short Vector Math Library (SVML). Эти функции вычисляют 128-разрядные, 256-разрядные или 512-разрядные векторные эквиваленты. Мы добавили их для поддержки векторизации вручную циклов с вызовами функций математических библиотек и некоторых других операций, таких как целочисленное деление. См. раздел Руководство по встроенным функциям Intel с определениями поддерживаемых функций.

  • Новые и улучшенные оптимизации:

    • Свертывание констант и арифметические упрощения для выражений с использованием векторных встроенных инструкций SIMD как для чисел с плавающей запятой, так и для целых чисел.

    • Более мощный анализ для извлечения информации из потока управления (инструкции if/else/switch) для удаления ветвей, которые всегда истинны или ложны.

    • Оптимизированное развертывание memset для использования векторных инструкций SSE2.

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

    • Улучшена оптимизация кода с использованием memmove, например конструкции std::copy или std::vector и std::string.

  • Оптимизирована физическая структура стандартной библиотеки, чтобы избежать компиляции частей, не включенных напрямую. Это в два раза ускоряет сборку пустого файла, включающего только <vector>. В результате этого изменения вам, возможно, потребуется добавить директивы #include для заголовков, которые ранее были включены косвенно. Например, если в коде используется std::out_of_range, теперь в него нужно добавить #include <stdexcept>. В коде, использующем оператор вставки потока, возможно, потребуется добавить #include <ostream>. Преимущество заключается в том, что затраты на пропускную способность применяются только при компиляции тех единиц перевода, которые фактически используют компоненты <stdexcept> или <ostream>.

  • if constexpr теперь более широко применяется в стандартной библиотеке для снижения нагрузки на пропускную способность и уменьшения размера кода в операциях копирования и преобразования (обращение и вращение), а также в библиотеке параллельных алгоритмов.

  • Стандартная библиотека теперь внутренне использует if constexpr для ускорения компиляции даже в режиме C++14.

  • При динамическом обнаружении связывания во время выполнения для библиотеки параллельных алгоритмов для хранения массива указателей на функции больше не используется целая страница. Использование этой памяти только для чтения более не считается важным для безопасности.

  • Конструктор std::thread больше не ожидает запуска потока и не вставляет так много уровней вызова функции между базовой библиотекой C _beginthreadex и предоставляемым вызываемым объектом. Ранее std::thread размещал шесть функций между _beginthreadex и предоставляемым вызываемым объектом. Это число уменьшено до трех, два из которых - просто std::invoke. Это изменение также позволяет устранить редкую ошибку, связанную со временем, когда конструктор std::thread переставал отвечать на запросы, если системное время было изменено в момент создания std::thread.

  • Исправлен регресс производительности в std::hash, вызванный внедрением std::hash<std::filesystem::path>.

  • Для обеспечения корректности стандартная библиотека теперь использует деструкторы вместо блоков catch в нескольких случаях. Теперь изменения обеспечивают лучшее взаимодействие отладчика: исключения, которые вы выбрасываете через стандартную библиотеку в затронутых участках, теперь отображаются как выброшенные с их исходного места выброса, а не с места повторного выброса. Не все блоки catch стандартной библиотеки были устранены. Мы планируем сократить число блоков catch в последующих выпусках MSVC.

  • Проблема с неоптимальной работой генератора кода в std::bitset из-за условного вызова в функции noexcept устранена. Для этого путь вызова был вынесен за скобки.

  • std::list и семейство std::unordered_* более широко внутренне используют итераторы без возможности отладки.

  • Некоторые элементы std::list были изменены так, чтобы при возможности оптимизировать процесс повторного использования узлов списков вместо их освобождения и повторного выделения. Например, если размер list<int> уже равен 3, вызов assign(4, 1729) теперь перезапишет значения int в первых трех узлах списков и выделит один новый узел списка со значением 1729.

  • Все вызовы erase(begin(), end()) из стандартной библиотеки изменены на clear().

  • В некоторых случаях std::vector теперь более эффективно инициализирует и удаляет элементы.

  • Усовершенствован std::variant для более дружественной работы с оптимизатором, что приводит к улучшению генерируемого кода. Встраивание кода теперь значительно улучшено с std::visit.

IDE C++

Поддержка Live Share C++

Live Share теперь поддерживает C++, позволяя разработчикам, использующим Visual Studio или Visual Studio Code, сотрудничать в режиме реального времени. Дополнительные сведения см. в статье "Анонс Live Share для C++: Совместное использование и сотрудничество в реальном времени"

Шаблон IntelliSense

В строке шаблона теперь используется пользовательский интерфейс Окно просмотра, а не модальное окно, поддерживаются вложенные шаблоны и автоматически заполняются аргументы по умолчанию в Окне просмотра. Дополнительные сведения см. в статье Усовершенствования шаблона IntelliSense для Visual Studio 2019, предварительная версия 2. Раскрывающийся список Недавно использовавшиеся в строке шаблона позволяет быстро переключаться между предыдущими наборами аргументов шаблона.

Новый интерфейс начального окна

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

Новые имена для некоторых шаблонов проектов

Мы изменили несколько имен и описаний шаблонов проектов в соответствии с обновленным диалоговым окном создания проекта.

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

Visual Studio 2019 включает в себя следующие возможности, которые помогут сделать процесс кодирования более простым и интуитивным:

  • Быстрые исправления для:
    • Добавить отсутствующий #include
    • NULL до nullptr
    • Добавить недостающую точку с запятой.
    • Устранение отсутствующего пространства имен или области видимости
    • Замена неправильных операндов косвенного обращения (* на & и & на *)
  • Быстрая информация о блоке при наведении указателя на закрывающую скобку
  • Просмотреть файл заголовка или кода
  • Функция "Перейти к определению" для #include открывает файл

Дополнительные сведения см. в статье Улучшения производительности C++ в Visual Studio 2019, предварительная версия 2.

Поддержка CMake

  • Поддержка CMake 3.14

  • Visual Studio теперь может открыть существующие кэши CMake, созданные внешними средствами, например CMakeGUI или пользовательскими системами мета-сборки, или создать скрипты, которые сами вызывают cmake.exe.

  • Усовершенствование производительности IntelliSense.

  • Новый редактор параметров предоставляет альтернативу редактированию файла CMakeSettings.json вручную и частичное равенство с CMakeGUI.

  • Visual Studio помогает начать разработку на C++ с помощью CMake в Linux, определяя наличие совместимой версии CMake на компьютере Linux. Если она отсутствует, предлагается ее установить.

  • Несовместимые параметры в CMakeSettings, например несоответствие архитектур или несовместимые параметры генератора CMake, выделены волнистыми линиями в редакторе JSON и отображаются в списке ошибок.

  • Цепочка инструментов vcpkg автоматически обнаруживается и включается для проектов CMake, которые открыты в интегрированной среде разработки, после запуска vcpkg integrate install. Это поведение можно отключить, указав пустой файл цепочки инструментов в CMakeSettings.

  • Проекты CMake теперь включают отладку "Только мой код" по умолчанию.

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

  • Более четкие сообщения о начале и конце сборки и конфигурации для проектов CMake, а также поддержка пользовательского интерфейса отображения хода сборки в Visual Studio. Кроме того, теперь есть параметр детализации CMake в разделе Инструменты > Параметры для настройки уровня детализации сообщений о сборке и конфигурации CMake в окне вывода.

  • Параметр cmakeToolchain теперь поддерживается в CMakeSettings.json для указания цепочек инструментов без изменения командной строки CMake вручную.

  • Новое сочетание клавиш для меню Собрать все — CTRL+SHIFT+B.

Интеграция IncrediBuild

IncrediBuild включается в виде дополнительного компонента в рабочую среду Разработка приложений для настольных систем на C++. Монитор сборки IncrediBuild полностью интегрирован в IDE Visual Studio. Подробные сведения см. в записи блога Visualize your build with IncrediBuild’s Build Monitor and Visual Studio 2019 (Визуализация сборки с помощью монитора сборки IncrediBuild и Visual Studio 2019).

Отладка

  • Для приложений на C++, работающих в Windows, PDB-файлы теперь загружаются в отдельном 64-разрядном процессе. Это изменение устраняет ряд сбоев, вызванных нехваткой памяти для отладчика. Например, были возможны сбои при отладке приложений, содержащих большое количество модулей и PDB-файлов.

  • Поиск включен в окнах наблюдений, автопеременных и локальных переменных.

Разработка настольных приложений для Windows на C++

  • Следующие мастера C++, ATL и MFC больше не доступны:

    • Мастер компонентов ATL COM+ 1.0
    • Мастер компонентов ATL Active Server Pages
    • Мастер поставщика OLE DB в ATL
    • Мастер страницы свойств ATL
    • Мастер потребителя ATL OLE DB
    • Потребитель ODBC MFC
    • Класс MFC из элемента управления ActiveX
    • Класс MFC из TypeLib.

    Пример кода для этих технологий архивируется в Microsoft Learn и репозитории VCSamples GitHub.

  • Пакет средств разработки программного обеспечения (SDK) Windows 8.1 больше не доступен в установщике Visual Studio. Обновите проекты C++ до последней версии Windows SDK. Если у вас есть жесткая зависимость от версии 8.1, ее можно скачать из архива Windows SDK.

  • Windows XP больше нельзя выбрать в качестве целевой платформы для последнего набора инструментов C++. Поддержка XP в библиотеках и компиляторе уровня MSVC от VS 2017 все еще поддерживается и может быть установлена через раздел "Отдельные компоненты".

  • В нашей документации настоятельно не рекомендуется использовать модули слияния для развертывания среды выполнения Visual C++. В этом выпуске мы предпринимаем дополнительные шаги, чтобы отметить наши MSM как устаревшие. Возможно, следует перенести центральное развертывание VCRuntime с MSM на распространяемый пакет.

Разработка мобильных приложений на C++ (для iOS и Android)

Опыт использования C++ на Android теперь по умолчанию использует Android SDK 25 и Android NDK 16b.

Набор средств платформы Clang/C2

Экспериментальный компонент Clang/C2 удален. Для обеспечения полного соответствия стандартам C++ используйте набор инструментов MSVC с параметрами /permissive- и /std:c++17 или же цепочку инструментов Clang/LLVM для Windows.

Анализ кода

Модульное тестирование

Шаблон управляемого тестового проекта C++ больше не доступен. Вы можете продолжить использование платформы управляемых тестов C++ в существующих проектах. Но для новых модульных тестов мы рекомендуем использовать собственные тестовые платформы, для которых Visual Studio предоставляет шаблоны (MSTest, Google Test), или шаблон управляемого тестового проекта C#.