Новые возможности 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). Дополнительные сведения см . в документации по Microsoft C++: новые возможности.

Новые возможности 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. Хотя реализация стандартов C++20 (как в настоящее время опубликовано ISO) завершена, некоторые ключевые функции библиотеки C++20, как ожидается, будут изменены предстоящими исправлениями ошибок (ISO C++20), которые могут изменить их в несовместимом виде. Дополнительные сведения см. в разделе Проблема Майкрософт/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.

  • Санитайзер адресов:

    • Предоставление поддержки санитайзера адресов в 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 теперь отображает более читаемые имена типов при работе со стандартной библиотекой.
    • Мы добавили возможность переключения функций ввода, пробела и табуляции в качестве символов фиксации и возможность выбора клавиши 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, в том числе новый набор правил перечисления, а также дополнительные правила для 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 в рамках анализа кода в фоновом режиме, результаты которой отображаются в виде предупреждений в редакторе (подчеркивания) и в Списке ошибок.

  • Обновлен файл заголовка <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 начиная с Visual Studio 2019 версии 16.11):
      • P0020R6 — atomic<floating-point>.
      • P0463R1: перечисление endian
      • P0482R6 — char8_t тип для символов и строк UTF-8.
      • P0653R2 — to_address() для преобразования указателя в необработанный указатель.
    • Доступно в /std:c++17 разделе и /std:c++latest (или /std:c++20 начиная с Visual Studio 2019 версии 16.11):
      • 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.

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

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

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

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

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

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

Поддержка CMake

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

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

  • Завершения и краткие сведения для встроенных команд, переменных и свойств 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 для использования C++ с подсистемой Windows для Linux (WSL). Теперь можно использовать локальную подсистему Windows для Linux (WSL) с C++ без дополнительной настройки или SSH-подключения благодаря встроенной поддержке Visual Studio. Подробные сведения см. в записи блога C++ with Visual Studio 2019 and Windows Subsystem for Linux (WSL) (C++ с Visual Studio 2019 и подсистемой Windows для Linux (WSL)).

Анализ кода

  • Добавлены новые быстрые исправления для проверок неинициализированных переменных. В меню со значком лампочки для соответствующих строк доступны предупреждения Code Analysis C6001. Использование неинициализированной памяти <variable> и C26494 VAR_USE_BEFORE_INIT. Они включены по умолчанию в минимальном рекомендуемом корпорацией Майкрософт наборе правил для машинного кода и наборе правил для типа C++ Core Check соответственно. Подробные сведения см. в записи блога New code analysis quick fixes for uninitialized memory (C6001) and use before init (C26494) warnings (Новые быстрые исправления анализа кода для предупреждений о неинициализированной памяти (C6001) и использовании переменных перед инициализацией (C26494)).

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

  • Теперь при разработке для 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) для удаления ветвей, которые всегда имеют значение true или false.

    • Улучшенное развертывание 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, сотрудничать в режиме реального времени. Дополнительные сведения см. в статье "Объявление динамической общей папки для 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 ASP
    • Мастер поставщика OLE DB в ATL
    • Мастер страницы свойств ATL
    • Мастер объекта-получателя OLE DB в ATL
    • Потребитель 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 и пакет NDK для Android 16b.

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

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

Анализ кода

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

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