Visual Studio 2019의 새로운 C++ 기능

Visual Studio 2019에는 Microsoft C++ 환경에 대한 많은 업데이트와 수정이 포함되었습니다. 컴파일러 및 도구에서 많은 버그와 문제가 해결되었습니다. 이러한 문제는 대부분, 고객이 피드백 보내기 아래의 문제 보고제안하기 옵션을 통해 제출한 것입니다. 버그를 알려 주셔서 감사합니다.

모든 Visual Studio의 새로운 기능에 대한 자세한 내용은 Visual Studio 2019의 새로운 기능을 참조하세요. Visual Studio 2017의 새로운 C++ 기능에 대한 자세한 내용은 Visual Studio 2017의 새로운 C++ 기능을 참조하세요. Visual Studio 2015 및 이전 버전의 새로운 C++ 기능에 대한 자세한 내용은 Visual C++ 2003~2015의 새로운 기능을 참조하세요. 자세한 내용은 Microsoft C++ 문서: 새로운 기능을 참조하세요.

Visual Studio 버전 16.11의 새로운 C++ 기능

Visual Studio 버전 16.11의 새로운 기능 및 버그 수정에 대한 요약은 Visual Studio 2019 버전 16.11의 새로운 기능을 참조하세요.

  • 이제 컴파일러가 /std:c++20 컴파일러 모드를 지원합니다. 이전에는 C++20 기능을 Visual Studio 2019의 /std:c++latest 모드에서만 사용할 수 있었습니다. 원래 /std:c++latest 모드를 필요로 했던 기능이 이제 Visual Studio 최신 버전의 /std:c++20 모드 이상에서 작동합니다.

  • Visual Studio와 함께 제공되는 LLVM 도구가 LLVM 12로 업그레이드되었습니다. 자세한 내용은 LLVM 릴리스 정보를 참조하세요.

  • Clang-cl 지원이 LLVM 12로 업데이트되었습니다.

Visual Studio 버전 16.10의 새로운 C++ 기능

Visual Studio 버전 16.10의 새로운 기능 및 버그 수정에 대한 요약은 Visual Studio 2019 버전 16.10의 새로운 기능을 참조하세요.

  • 이제 /std:c++latest에서 모든 C++20 기능을 사용할 수 있습니다. MSVC의 C++20 표준 구현(현재 ISO에서 게시됨)은 기능이 완벽하게 제공되지만, 일부 주요 C++20 라이브러리 기능은 예정된 오류 보고서에 의해 수정될(ISO C++20 버그 수정) 예정이며 ABI 호환 방식으로 변경할 수도 있습니다. 자세한 내용은 Microsoft/STL 문제 #1814를 참조하세요.

    • 16.10에 C++ 20 직접 함수 및 constinit 지원을 추가했습니다.
    • <chrono>의 마지막 부분: 새 시계, 윤초, 표준 시간대 및 구문 분석
    • 텍스트 서식을 위한 <format> 구현
  • /openmp:llvm은 이제 x64 외에 x86 및 ARM64에서도 사용할 수 있습니다.

  • 포함 디렉터리는 이제 사용자 지정된 컴파일 경고 수준 및 코드 분석 설정과 함께 외부로 지정할 수 있습니다.

  • 이전 언어 모드에서 C++20 스타일 코루틴을 사용하도록 /await:strict 옵션을 추가했습니다.

  • 이제 std::coroutine_handle<T>의 디버거 시각화에는 원래 코루틴 함수 이름 및 시그니처와 현재 일시 중단 지점이 표시됩니다.

  • CMakePresets 지원을 추가했습니다.

  • 이제 Visual Studio에서 새 원격 연결을 추가할 때 서버에서 제공하는 호스트 키 지문을 수락하거나 거부해야 합니다.

  • 경고를 위해 외부로 처리되어야 하는 헤더를 지정하기 위해 MSVC에 /external 스위치를 추가했습니다.

Visual Studio 버전 16.9의 새로운 C++ 기능

Visual Studio 버전 16.9의 새로운 기능 및 버그 수정에 대한 요약은 Visual Studio 2019 버전 16.9의 새로운 기능을 참조하세요.

  • 주소 삭제기:

    • Windows에 대한 주소 삭제기 지원은 이제 더 이상 실험 모드가 아니며 일반 공급 상태가 되었습니다.

    • RtlAllocateHeap 지원을 확장했고 실행 가능한 메모리 풀을 만들 때 RtlCreateHeapRtlAllocateHeap 인터셉터의 호환성 문제가 해결되었습니다.

    • 메모리 함수의 레거시 GlobalAllocLocalAlloc 패밀리에 대한 지원이 추가되었습니다. 환경 플래그 ASAN_OPTIONS=windows_hook_legacy_allocators=true를 설정하여 이러한 인터셉터를 사용하도록 설정할 수 있습니다.

    • 문제 및 해결을 명시적으로 만들 수 있도록 섀도 메모리 인터리빙 및 인터셉션 실패의 오류 메시지가 업데이트되었습니다.

    • 이제 IDE 통합이 ASan에서 보고할 수 있는 전체 예외 컬렉션을 처리할 수 있습니다.

    • 컴파일러와 링커는 사용자가 ASan을 사용하여 빌드하고 있지만 디버그 정보를 내보내지 않는 것을 검색하는 경우 디버그 정보 내보내기를 제안합니다.

  • 이제 새 /openmp:llvm 으로 OpenMP 런타임의 LLVM 버전을 대상으로 지정할 수 있습니다. 이렇게 하면 #pragma omp 섹션의 lastprivate 절과 병렬 for 루프의 부호 없는 인덱스 변수에 대한 지원이 추가됩니다. /openmp:llvm 스위치는 현재 amd64 대상에만 사용할 수 있으며, 아직 실험 단계입니다.

  • 이제 Visual Studio CMake 프로젝트에 원격 Windows 개발을 위한 고급 지원이 포함됩니다. 여기에는 Windows ARM64를 대상으로 하도록 CMake 프로젝트 구성, 원격 Windows 컴퓨터에 프로젝트 배포, Visual Studio에서 원격 Windows 컴퓨터의 프로젝트 디버깅이 포함됩니다.

  • Windows에서 Visual Studio와 함께 제공되는 Ninja 버전이 버전 1.10으로 업데이트되었습니다. 포함된 기능에 대한 자세한 내용은 Ninja 1.10 릴리스 정보를 참조하세요.

  • Visual Studio와 함께 제공되는 CMake 버전이 버전 3.19로 업데이트되었습니다. 포함된 기능에 대한 자세한 내용은 CMake 3.19 릴리스 정보를 참조하세요.

  • STL에서 여러 lock/guard 형식을 nodiscard로 표시했습니다.

  • IntelliSense:

  • 이제 MSVC에서 이진 파일에 필요한 올바른 주소 삭제기 런타임을 확인합니다. Visual Studio 프로젝트에서 새로운 변경 내용을 자동으로 가져옵니다. 명령줄에서 주소 삭제기를 사용할 때 이제 컴파일러에 /fsanitize=address만 전달하면 됩니다.

  • 이제 Visual Studio의 연결 관리자가 ECDSA 퍼블릭 키 알고리즘을 사용하여 프라이빗 키를 지원합니다.

  • 설치 관리자에 포함된 LLVM 및 Clang의 버전이 v11로 업데이트되었습니다. 자세한 내용은 LLVM에 및 Clang 릴리스 정보를 참조하세요.

  • 이제 Visual Studio가 도구 체인 파일의 CMake 변수를 사용하여 IntelliSense를 구성합니다. 이를 통해 임베디드 개발과 Android 개발을 위한 향상된 환경이 제공됩니다.

  • 더 많은 Constexpr 컨테이너 제안을 구현하여 소멸자 및 새 식이 constexpr가 될 수 있습니다. 이를 통해 constexprstd::vector, std::string 같은 유틸리티를 사용할 수 있습니다.

  • 정의로 이동, 모듈로 이동 및 멤버 완성을 포함하여 C++20 모듈 IntelliSense에 대한 지원을 확장했습니다.

  • 이제 MSVC 컴파일러에서 약식 함수 템플릿을 지원합니다.

Visual Studio 버전 16.8의 새로운 C++ 기능

Visual Studio 버전 16.8의 새로운 기능 및 버그 수정에 대한 요약은 Visual Studio 2019 버전 16.8의 새로운 기능을 참조하세요.

  • C++20 코루틴은 이제 /std:c++latest(또는 Visual Studio 2019 버전 16.11부터 /std:c++20 ) 및 <coroutine> 헤더에서 지원됩니다.

  • 이제 IntelliSense는 C++20 <concepts><ranges> 헤더를 지원하고, 개념 정의의 이름 바꾸기 및 검색을 제공합니다.

  • 이제 STL은 대부분의 C++20 범위를 지원합니다.

  • 이제 조건부로 트리비얼한 특수 멤버 함수가 MSVC에서 지원됩니다.

  • 이제 C11 및 C17이 /std:c11/std:c17 스위치에서 지원됩니다.

  • 추가 STL 개선 사항에는 std::atomic_ref, std::midpoint, std::lerpstd::execution::unseq에 대한 완벽한 지원, std::reverse_copy에 대한 최적화 등이 포함됩니다.

  • Visual Studio와 함께 제공되는 CMake 버전을 CMake 3.18로 업그레이드했습니다.

  • 이제 코드 분석 도구는 업계 표준 정적 분석 로그 형식인 SARIF 2.1 표준을 지원합니다.

  • 이제 Linux 프로젝트의 누락된 빌드 도구는 도구 모음에서 경고를 표시하고, 오류 목록에서 누락된 도구에 대한 명확한 설명을 표시합니다.

  • 이제 Visual Studio에서 직접 원격 Linux 시스템 또는 WSL의 Linux 코어 덤프를 디버그할 수 있습니다.

  • C++ Doxygen 주석 생성의 경우 추가 주석 스타일 옵션(/*!//!)을 추가했습니다.

  • 추가 vcpkg 알림.

  • 확인되지 않은 컨텍스트에서 람다에 대한 컴파일러 지원.

  • 다중 스레딩 PDB 생성으로 /DEBUG:FULL 링크 성능 향상. 여러 대규모 애플리케이션 및 AAA 게임의 경우 연결이 2~4배 빨라집니다.

  • 이제 Visual Studio 디버거는 char8_t 를 지원합니다.

  • clang-cl을 사용하여 ARM64 프로젝트 지원.

  • Intel AMX 내장 함수 지원.

Visual Studio 버전 16.7의 새로운 C++ 기능

Visual Studio 버전 16.7의 새로운 기능 및 버그 수정에 대한 요약은 Visual Studio 2019 버전 16.7의 새로운 기능을 참조하세요.

  • 이제 원격 C++ 지원에서 sh, csh, bash, tsch, ksh, zsh 및 dash를 비롯해 더 광범위한 Linux 배포판 및 셸을 지원합니다. ConnectionManager.exe를 통해 새 “shell” 속성을 수정하여 원격 연결의 셸 선택을 재정의할 수 있습니다. 이 지원은 원격 Linux 시스템 또는 WSL을 대상으로 하는 CMake 프로젝트와 MSBuild 기반 Linux 프로젝트 모두에서 테스트되었습니다.

  • 이제 Ninja(증분 빌드를 매우 빠르게 평가하는 빌드 시스템)를 사용하여 MSBuild 기반 Linux 프로젝트의 증분 빌드 시간을 단축할 수 있습니다. 이 기능을 옵트인하려면 일반 속성 페이지에서 “Enable Incremental Build”(증분 빌드 사용)를 “With Ninja”(Ninja 사용)로 설정합니다. Ninja(ninja-build)가 원격 Linux 시스템 또는 WSL에 설치되어 있어야 합니다.

  • 새 C++20 표준 라이브러리 기능이 구현되었습니다. 자세한 목록은 GitHub의 STL 변경 로그를 참조하세요.

  • 이제 연결 관리자에서 기본 원격 SSH 연결을 편집하고 설정할 수 있습니다. 즉, 기존 원격 연결을 편집하고(예: IP 주소가 변경된 경우) CMakeSettings.json 및 launch.vs.json에서 기본 연결을 사용하도록 설정할 수 있습니다. 원격 SSH 연결을 사용하면 Visual Studio에서 직접 원격 Linux 시스템의 C++ 프로젝트를 빌드하고 디버그할 수 있습니다.

  • Visual Studio에서 Windows의 Clang(clang-cl)에 대한 IntelliSense 지원이 향상되었습니다. 이제 clang 포함 경로에 clang 라이브러리가 포함되며, 표준 라이브러리를 사용할 때의 편집기 내 물결선 표시를 개선하고 clang 모드에서 C++2a에 대한 지원을 추가했습니다.

  • 이제 코드 오류에 밑줄을 표시하고 C++ 프로젝트에서 제안된 빠른 수정 사항을 확인할 수 있습니다. 도구 > 옵션 > 텍스트 편집기 > C/C++ > 실험적에서 이 기능을 사용하도록 설정합니다. 실험적 코드 Linter 사용 안 함을 false로 설정합니다. C++ 팀 블로그에서 자세히 알아보세요.

  • 추가 보안 기능을 C++에 통합하는 네 가지 새로운 코드 분석 규칙을 추가했습니다. C26817, C26818, C26819, and C26820.

  • gdbserver를 사용하여 원격 시스템에서 CMake 프로젝트를 디버그하기 위한 최고 수준의 지원이 추가되었습니다.

  • Visual Studio에서 C++용 AddressSanitizer의 실험적 구현(이제 x64 네이티브 프로젝트에 사용할 수 있음)으로 메모리 손상 오류를 쉽게 찾을 수 있습니다. 또한 이제 디버그 런타임(/MTd, /MDd, /LDd) 사용을 지원합니다.

  • IntelliSense에서 이제 개념, 지정된 이니셜라이저 및 몇 가지 다른 C++20 기능을 기본적으로 지원합니다.

  • .ixx.cppm 파일은 이제 C++로 인식되며 구문 형광펜 및 IntelliSense에서 이와 같이 처리됩니다.

Visual Studio 버전 16.6의 새로운 C++ 기능

Visual Studio 버전 16.6의 새로운 기능 및 버그 수정에 대한 요약은 Visual Studio 2019 버전 16.6의 새로운 기능을 참조하세요.

  • Doxygen/XML 주석 생성 개선: 함수 위에 /// 또는 /**를 입력하여 자동으로 Doxygen 또는 XML 문서 주석 스텁을 생성합니다. 이제 이 기능이 요약 정보 도구 설명에도 표시됩니다.

  • Ninja에서 Linux/WSL용 CMake 지원: WSL 또는 원격 시스템에서 CMake 프로젝트를 빌드할 때 기본 생성기로 Ninja를 사용합니다. 이제 새 Linux 또는 WSL 구성을 추가할 때 Ninja가 기본 생성기입니다.

  • 원격 CMake 디버깅을 위한 디버그 템플릿: Gdb를 사용하여 원격 Linux 시스템 또는 WSL에서 CMake 프로젝트를 디버그하기 위해 템플릿을 간소화했습니다.

  • C++20 개념에 대한 초기 지원: 이제 IntelliSense가 C++20 개념을 인식하고 멤버 목록에서 이 개념을 제안합니다.

Visual Studio 버전 16.5의 새로운 C++ 기능

Visual Studio 버전 16.5의 새로운 기능 및 버그 수정에 대한 요약은 Visual Studio 2019 버전 16.5의 새로운 기능을 참조하세요.

  • IntelliCode 팀 완성 모델 및 멤버 변수 지원: C++ 개발자는 이제 자체 코드베이스에서 IntelliCode 모델을 학습시킬 수 있습니다. 이 모델은 팀의 사례를 활용하므로 팀 완성 모델이라고 불립니다. 또한 멤버 변수에 대한 IntelliCode 제안을 개선했습니다.

  • IntelliSense 개선 사항:

    • IntelliSense는 이제 표준 라이브러리를 처리할 때 더 읽기 쉬운 형식 이름을 표시합니다.
    • Enter, SpaceTab이 커밋 문자로 작동할지 여부와 Tab이 코드 조각을 삽입하는 데 사용될지 여부를 설정/해제하는 기능이 추가되었습니다. 도구 > 옵션 > 텍스트 편집기 > C/C++ > 고급 > IntelliSense에서 해당 옵션을 찾으세요.
  • 명령줄을 통한 연결 관리자: 이제 명령줄을 통해 저장된 원격 연결과 상호 작용할 수 있습니다. 이는 새 개발 컴퓨터를 프로비저닝하거나 연속 통합에 Visual Studio를 설정하는 등의 작업에 유용합니다.

  • WSL 디버그 및 배포: Visual Studio의 WSL 기본 지원을 사용하여 원격 배포 시스템에서 빌드 시스템을 분리합니다. 이제 WSL에서 기본적으로 빌드하여 빌드 아티팩트를 디버깅용 두 번째 원격 시스템에 배포할 수 있습니다. 이 워크플로는 CMake 프로젝트 및 MSBuild 기반 Linux 프로젝트 모두에서 지원됩니다.

  • FIPS 140-2 준수 모드 지원: 이제 Visual Studio는 원격 Linux 시스템을 대상으로 하는 C++ 애플리케이션을 개발할 때 FIPS 140-2 준수 모드를 지원합니다.

  • CMake 언어 파일 및 더 나은 CMake 프로젝트 조작을 위한 언어 서비스:

    • 원격 Linux 시스템을 대상으로 하는 CMake 프로젝트의 소스 파일 복사본이 최적화되었습니다. 이제 Visual Studio에서 원격으로 복사된 마지막 소스 세트의 “지문 파일”을 유지하고 변경된 파일 수에 따라 동작을 최적화합니다.

    • CMake 스크립트 파일의 함수, 변수 및 대상에 대해 정의로 이동 및 모든 참조 찾기와 같은 코드 탐색 기능이 지원됩니다.

    • CMake 스크립트를 수동으로 편집하지 않고 IDE에서 CMake 프로젝트의 소스 파일 및 대상을 추가하고, 제거하고, 이름을 바꿉니다. 솔루션 탐색기를 사용하여 파일을 추가하거나 제거하는 경우 Visual Studio가 CMake 프로젝트를 자동으로 편집합니다. 솔루션 탐색기의 대상 뷰에서 프로젝트의 대상을 추가하고, 제거하고, 이름을 바꿀 수도 있습니다.

  • Linux 프로젝트 개선 사항: 이제 Visual Studio Linux 프로젝트는 보다 정확한 IntelliSense를 사용하여 프로젝트 단위로 원격 헤더 동기화를 제어할 수 있도록 합니다.

Visual Studio 버전 16.4의 새로운 C++ 기능

Visual Studio 버전 16.4의 새로운 기능 및 버그 수정에 대한 요약은 Visual Studio 2019 버전 16.4의 새로운 기능을 참조하세요.

  • Clang 또는 MSVC 도구 집합 사용 여부와 관계없이 이제 Code Analysis에서 MSBuild 및 CMake 프로젝트 모두에 대해 Clang-Tidy를 기본적으로 지원합니다. Clang-tidy 검사는 백그라운드 코드 분석의 일부로 실행될 수 있으며, 편집기에서 경고(물결선)로 표시되 고 오류 목록에 나타납니다.

  • Visual Studio CMake 프로젝트에 플랫폼 간 개발을 시작하는 데 도움이 되는 개요 페이지가 적용되었습니다. 개요 페이지는 동적으로 바뀌며, Linux 시스템에 연결하고 CMake 프로젝트에 Linux 또는 WSL 구성을 추가할 수 있도록 지원합니다.

  • CMake 프로젝트의 시작 드롭다운 메뉴에 가장 최근에 사용한 대상이 표시되며 필터링도 가능합니다.

  • C++/CLI가 Windows에서 .NET Core 3.1 이상과의 상호 운용성을 지원합니다.

  • 메모리 오류를 탐지하는 데 도움이 되는 C++ 코드의 런타임 계측을 위해 Windows에서 MSVC로 컴파일한 프로젝트에 대해 ASan을 사용 설정할 수 있습니다.

  • MSVC의 C++ 표준 라이브러리 업데이트:

    • C++17: to_chars()일반 정밀도를 구현하여 P0067R5 기본 문자열 변환(charconv)이 완료됩니다. 이를 통해 C++17 표준의 모든 라이브러리 기능 구현이 완료됩니다.
    • C++20: P1754R1을 구현했습니다. 개념 이름을 standard_case로 변경합니다. 이 기능을 포함하려면 /std:c++latest 컴파일러 옵션(또는 Visual Studio 2019 버전 16.11부터 /std:c++20 )을 사용합니다. 이 옵션은 구성 속성 > C/C++ > 언어 프로젝트 속성 페이지에서 C++ 언어 표준 속성을 사용하여 설정할 수도 있습니다.
  • 이제 C++ Build Insights라는 새 도구 모음을 사용할 수 있습니다. 공지 사항에 대한 자세한 내용은 C++ 팀 블로그를 참조하세요.

Visual Studio 버전 16.3의 새로운 C++ 기능

Visual Studio 버전 16.3의 새로운 기능 및 버그 수정에 대한 요약은 Visual Studio 2019 버전 16.3의 새로운 기능을 참조하세요.

  • 이제 C++ 개발자는 바로 가기 키 Ctrl+K, Ctrl+/ 를 사용하여 줄 주석을 토글할 수 있습니다.

  • IntelliSense 멤버 목록은 이제 형식 한정자를 기준으로 필터링됩니다. 예를 들어 const std::vectorpush_back과 같은 메서드를 필터링합니다.

  • 이러한 C++20 표준 라이브러리 기능이 추가되었습니다( /std:c++latest 에서 또는 Visual Studio 2019 버전 16.11부터 /std:c++20 에서 사용 가능).

    • P0487R1: operator>>(basic_istream&, CharT*) 수정
    • P0616R0: <numeric>에서 move() 사용
    • P0758R1: is_nothrow_convertible
    • P0734R0: 개념에 대한 C++ 확장
    • P0898R3: 표준 라이브러리 개념
    • P0919R3: 순서 없는 컨테이너에 대한 다른 유형 조회
  • 새 “열거형 규칙” 규칙 집합 및 추가 const, enum 및 형식 규칙을 포함한 새로운 C++ Core 지침 확인

  • 사용자가 새로운 기본 의미 체계 색 지정 구성표를 사용하여 코드를 한눈에 더 잘 이해할 수 있으며, 템플릿 인수를 숨기도록 호출 스택 창을 구성할 수 있고, C++ IntelliCode가 기본적으로 켜져 있습니다.

  • CMakeSettings.json 또는 CppProperties.json에서 환경 변수를 사용하거나 launch.vs.json 및 tasks.vs.json에서 개별 대상 및 작업에 새 “env” 태그를 사용하여 디버그 대상 및 사용자 지정 작업을 구성합니다.

  • 이제 사용자는 누락된 vcpkg 패키지에서 빠른 작업을 사용하여 자동으로 콘솔을 열고 기본 vcpkg 설치에 설치할 수 있습니다.

  • Linux 프로젝트(CMakeMSBuild)에서 수행한 원격 헤더 복사가 최적화되었고 이제 병렬로 실행됩니다.

  • 이제 Visual Studio의 WSL 기본 지원은 MSBuild 기반 Linux 프로젝트의 병렬 빌드를 지원합니다.

  • 이제 사용자는 Linux 메이크파일 프로젝트를 사용하여 원격 시스템에 배포할 로컬 빌드 출력 목록을 지정할 수 있습니다.

  • CMake 설정 편집기의 설정 설명에는 이제 추가 컨텍스트 및 유용한 설명서 링크가 포함됩니다.

  • IntelliCode용 C++ 기본 모델은 이제 기본적으로 사용하도록 설정됩니다. 도구>옵션>IntelliCode로 이동하여 이 설정을 변경할 수 있습니다.

Visual Studio 버전 16.2의 새로운 C++ 기능

Visual Studio 버전 16.2의 새로운 기능 및 버그 수정에 대한 요약은 Visual Studio 2019 버전 16.2의 새로운 기능을 참조하세요.

  • Clang로 구성 된 로컬 CMake 프로젝트에 대해 코드 분석에서 이제 clang-tidy 검사를 실행하며, 백그라운드 코드 분석의 일부로 편집기 내 경고(굽은 모양) 및 오류 목록 형태로 표시됩니다.

  • C++17의 P0067R5 기본 문자열 변환용 <charconv> 헤더 업데이트:

    • chars_format::fixedchars_format::scientific 정밀도를 위해 부동 소수점 to_chars() 오버로드 추가(chars_format::general precision 부분만 아직 구현되지 않음)
    • chars_format::fixed 최단 최적화
  • 다음 C++20 표준 라이브러리 기능을 추가했습니다.

    • /std:c++latest Visual Studio 2019 버전 16.11에서 사용 가능(또는 /std:c++20 Visual Studio 2019 버전 16.11부터 시작):
      • P0020R6: atomic<floating-point>
      • P0463R1: endian 열거형
      • P0482R6: UTF-8 문자 및 문자열에 대해 char8_t 형식
      • P0653R2: 포인터의 원시 포인터 변환용 to_address()
    • Visual Studio 2019 버전 16.11에서 /std:c++17 사용 가능( /std:c++latest 또는 /std:c++20 Visual Studio 2019 버전 16.11부터):
      • P0600R1: 라이브러리의 [[nodiscard]]
    • 무조건 사용 가능:
      • P0754R2: <version> 헤더
      • P0771R1: std::function 이동 생성자는 noexcept여야 함
  • Windows SDK는 이제 Windows용 CMake 및 Linux 구성용 CMake 구성 요소에 종속성이 없습니다.

  • 가장 큰 입력에 대한 반복 빌드 시간을 개선할 수 있도록 C++ 링커의 기능이 개선되었습니다. /DEBUG:FAST/INCREMENTAL 시간은 평균적으로 2배 빠르고 /DEBUG:FULL 는 이제 3~6배 빠릅니다.

Visual Studio 버전 16.1의 새로운 C++ 기능

Visual Studio 버전 16.1의 새로운 기능 및 버그 수정에 대한 요약은 Visual Studio 2019 버전 16.1의 새로운 기능을 참조하세요.

C++ 컴파일러

  • /std:c++latest (또는 Visual Studio 2019 버전 16.11부터 /std:c++20 )에서 제공되는 C++ 컴파일러에 다음 C++20 기능이 구현되었습니다.

    • 명시적 템플릿 인수를 사용하는 함수 호출 식에 대한 인수 종속 조회를 통해 함수 템플릿을 찾는 기능이 향상되었습니다(P0846R0).
    • 집계 초기화에서 특정 멤버를 선택할 수 있는(예를 들어 Type t { .member = expr } 구문을 사용) 지정된 초기화(P0329R4).
  • 람다 지원은 오래된 수 많은 버그를 해결하면서 개선되었습니다. 이 변경 내용은 /std:c++20 또는 /std:c++latest 사용 시 기본적으로 사용됩니다. /std:c++17 언어 모드 및 기본( /std:c++14 ) 모드에서 Visual Studio 2019 버전 16.9의 /Zc:lambda를 사용하여(이전에는 Visual Studio 2019 버전 16.3부터 /experimental:newLambdaProcessor 로 사용 가능) 새 파서를 사용하도록 설정할 수 있습니다(예: /std:c++17 /Zc:lambda).

C++ 표준 라이브러리 향상

  • 이러한 C++20 기능은 다음에서 /std:c++latest사용할 수 있는 C++ 표준 라이브러리 구현에 추가되었습니다.
    • basic_stringbasic_string_view에 대한 starts_withends_with.
    • 연관 컨테이너에 대한 contains.
    • listforward_list에 대한 remove, remove_ifunique가 이제 size_type을 반환합니다.
    • shift_leftshift_right<algorithm>에 추가되었습니다.

C++ IDE

C++용 IntelliCode

이제 IntelliCode는 C++를 사용한 데스크톱 개발 워크로드의 선택적 구성 요소로 제공됩니다. 자세한 내용은 Improved C++ IntelliCode now Ships with Visual Studio 2019(이제 향상된 C++ IntelliCode가 Visual Studio 2019와 함께 제공됨)을 참조하세요.

IntelliCode는 광범위한 자체 학습 및 코드 컨텍스트를 사용하여 사용할 가능성이 가장 높은 항목을 완성 목록의 맨 위에 배치합니다. 목록을 아래로 스크롤할 필요가 없어질 수 있습니다. C++의 경우 IntelliCode는 표준 라이브러리와 같은 인기 라이브러리를 사용할 때 가장 도움이 됩니다.

새 IntelliCode 기능(사용자 지정 모델, C++ 지원, EditorConfig 추론)은 기본적으로 사용되지 않습니다. 이러한 기능을 사용하도록 설정하려면 도구 > 옵션 > IntelliCode > 일반으로 이동합니다. 이 IntelliCode의 버전은 정확도가 향상되었으며 무료 함수에 대한 지원을 포함합니다. 자세한 내용은 IntelliCode를 통해 C++에 대한 AI 지원 코드 완성 추천을 참조하세요.

요약 정보 개선 사항

  • 이제 요약 정보 도구 설명은 편집기의 의미 체계 색 지정을 따릅니다. 가리킨 코드 구문에 대한 정보를 알아보기 위해 온라인 문서를 검색할 새로운 온라인 검색 링크도 포함됩니다. 빨간색 구부러진 곡선 코드가 제공하는 링크는 온라인으로 오류를 검색합니다. 이 방법을 사용하면 브라우저에 메시지를 다시 입력하지 않아도 됩니다. 자세한 내용은 Quick Info Improvements in Visual Studio 2019: Colorization and Search Online(Visual Studio 2019의 요약 정보 향상: 색 지정 및 온라인 검색)을 참조하세요.

일반 개선 사항

  • 이제 템플릿 표시줄은 코드베이스에 있는 해당 템플릿의 인스턴스화를 기반으로 드롭다운 메뉴를 채울 수 있습니다.

  • vcpkg가 설치할 수 있는 누락된 #include 지시문의 전구 및 CMake find_package 지시문에 사용할 수 있는 패키지 자동 완성.

  • C++ 프로젝트에 대한 일반 속성 페이지가 수정되었습니다. 이제 몇몇 옵션이 새 고급 페이지 아래에 나열됩니다. 고급 페이지에는 기본 도구 집합 아키텍처, 디버그 라이브러리, MSVC 도구 집합 부 버전 및 Unity(jumbo) 빌드에 대한 새로운 속성도 포함되어 있습니다.

CMake 지원

  • Visual Studio와 함께 제공되는 CMake 버전을 3.14로 업데이트했습니다. 이 버전에는 파일 기반 IDE 통합 API뿐만 아니라 Visual Studio 2019 프로젝트를 대상으로 하는 MSBuild 생성기에 대한 기본 제공 지원이 추가되었습니다.

  • WSL(Linux용 Windows 하위 시스템) 지원 및 기존 캐시의 구성, 기본 빌드 및 설치 루트로 변경, Linux CMake 구성의 환경 변수 지원을 포함하여 CMake 설정 편집기의 기능을 개선했습니다.

  • 기본 제공 CMake 명령, 변수 및 속성에 대한 완성 및 요약 정보를 통해 CMakeLists.txt 파일을 쉽게 편집할 수 있습니다.

  • Clang/LLVM을 사용하여 CMake 프로젝트를 편집, 빌드 및 디버그하기 위한 지원을 통합했습니다. 자세한 내용은 Clang/LLVM Support in Visual Studio(Visual Studio의 Clang/LLVM 지원)를 참조하세요.

Linux 및 Linux용 Windows 하위 시스템

코드 분석

원격 빌드

  • 이제 MSBuild 및 CMake에서 둘 다 Linux를 대상으로 할 때 원격 빌드 머신을 원격 디버그 머신과 분리할 수 있습니다.

  • 원격 연결에 대한 향상된 로깅을 통해 플랫폼 간 개발의 문제를 쉽게 진단할 수 있습니다.

Visual Studio 버전 16.0의 새로운 C++ 기능

Visual Studio 버전 16.0의 새로운 기능 및 버그 수정에 대한 요약은 Visual Studio 2019 버전 16.0의 새로운 기능을 참조하세요.

C++ 컴파일러

  • C++ 17 기능 및 정확성 수정에 대한 향상된 지원 및 모듈, 코루틴 등과 같은 C++ 20 기능에 대한 실험적 지원입니다. 자세한 내용은 Visual Studio 2019의 C++ 규칙 향상을 참조하세요.

  • /std:c++latest 옵션에는 세 방향 비교를 위한 C++20 연산자 <=>(“spaceship”)의 초기 지원을 비롯하여 완료되지 않은 C++20 기능이 포함되어 있습니다.

  • C++ 컴파일러 스위치 /Gm은 이제 사용되지 않습니다. 명시적으로 정의된 경우 빌드 스크립트에서 /Gm 스위치를 사용하지 않도록 설정하는 것이 좋습니다. 하지만 "경고를 오류로 처리"(/WX)를 사용하는 경우 오류로 처리되지 않으므로 /Gm에 대한 사용 중단 경고를 안전하게 무시할 수도 있습니다.

  • MSVC가 /std:c++latest 플래그 아래 C++20 표준 초안에서 기능을 구현하기 시작하므로 이제 /std:c++latest/clr(모든 버전), /ZW/Gm과 호환되지 않습니다. Visual Studio 2019에서는 /clr, /ZW 또는 /Gm으로 컴파일할 경우 /std:c++17 또는 /std:c++14 모드를 사용합니다(하지만 이전 글머리 기호 참조).

  • C++ 콘솔 및 데스크톱 앱의 경우 미리 컴파일된 헤더가 더 이상 생성되지 않습니다.

Codegen, 보안, 진단 및 버전 관리

Spectre 변형 1(CVE-2017-5753)에 대한 완화 지원을 제공하기 위해 /Qspectre를 사용한 분석을 개선했습니다. 자세한 내용은 MSVC의 스펙터 완화를 참조하세요.

C++ 표준 라이브러리 향상

  • 추가 C++17 및 C++20 라이브러리 기능 및 정확성 수정의 구현입니다. 자세한 내용은 Visual Studio 2019의 C++ 규칙 향상을 참조하세요.

  • 가독성 향상을 위해 C++ 표준 라이브러리 헤더에 Clang 형식을 적용했습니다.

  • 이제 Visual Studio가 C++에 대해 내 코드만을 지원하므로 표준 라이브러리에서 동일한 효과를 얻기 위해 std::functionstd::visit의 사용자 지정 동작을 더 이상 제공할 필요가 없습니다. 해당 동작을 제거해도 대체로 사용자에게 보이는 효과는 없습니다. 단, 컴파일러가 <type_traits> 또는 <variant>의 줄 15732480 또는 16707566에 문제가 있음을 나타내는 진단을 더 이상 생성하지 않습니다.

컴파일러 및 표준 라이브러리의 성능/처리량 향상

  • 링커에서 파일 I/O를 처리하는 방식 및 PDB 형식 병합 및 생성 시 링크 시간을 포함한 빌드 처리량 향상된 기능입니다.

  • OpenMP SIMD 벡터화에 대한 기본 지원을 추가했습니다. 새 컴파일러 스위치 /openmp:experimental을 사용하여 사용하도록 설정할 수 있습니다. 이 옵션을 사용하면 #pragma omp simd로 주석을 단 루프가 잠재적으로 벡터화될 수 있습니다. 벡터화는 보장되지 않으며 주석이 있지만 벡터화되지 않은 루프에는 보고된 경고가 표시됩니다. SIMD 절은 지원되지 않으므로 무시되고 경고가 보고됩니다.

  • /Ob2의 적극적인 버전인 새로운 인라인 명령줄 스위치 /Ob3을 추가했습니다. /O2(속도를 위해 이진 파일 최적화)는 기본적으로 /Ob2를 의미합니다. 컴파일러가 충분히 적극적으로 인라인하지 않는다면 /O2 -Ob3을 전달하는 것이 좋습니다.

  • SVML(Short Vector Math Library) 내장 함수에 대한 지원이 추가되었습니다. 이러한 함수는 해당하는 128비트, 256비트 또는 512비트 벡터를 컴퓨팅합니다. 수학 라이브러리 함수 및 정수 나누기와 같은 다른 특정 연산에 대한 호출을 포함하는 루프의 수동 벡터화를 지원하기 위해 이 지원을 추가했습니다. 지원되는 기능에 대한 정의는 Intel Intrinsic 가이드를 참조하세요.

  • 새로운 기능과 향상된 최적화:

    • 부동 소수점 및 정수 양식 모두에 대해 SIMD 벡터 내장 함수를 사용하는 식에 대한 상수 폴딩 및 산술을 단순화했습니다.

    • 제어 흐름(if/else/switch 문)에서 정보를 추출하여 항상 true 또는 false인 것으로 입증되는 분기를 제거하기 위한 강력한 분석을 추가했습니다.

    • SSE2 벡터 지침을 사용하도록 memset 언롤링을 개선했습니다.

    • 특히 값으로 전달되는 C++ 프로그램의 경우 쓸모 없는 구조체/클래스 복사본 제거를 개선했습니다.

    • std::copy, std::vectorstd::string 구문과 같은 memmove를 사용하여 코드의 최적화를 개선했습니다.

  • 직접 포함되지 않은 표준 라이브러리 파트가 컴파일되지 않도록 표준 라이브러리 실제 디자인을 최적화했습니다. 이 변경으로 인해 <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와 제공된 호출 가능 개체 사이에 여섯 개의 함수를 배치했습니다. 이 숫자는 단 3개로 축소되었으며, 그중 2개만 std::invoke입니다. 이 변경을 통해 정확히 std::thread가 생성되는 시점에 시스템 시계가 변경된 경우 std::thread의 생성자가 응답을 중지하는 모호한 타이밍 버그가 해결됩니다.

  • std::hash<std::filesystem::path>를 구현할 때 도입된 std::hash에서 성능 회귀를 수정했습니다.

  • 이제 표준 라이브러리의 여러 곳에서 정확성을 위해 catch 블록 대신 소멸자를 사용합니다. 이 변경으로 인해 디버거 상호 작용이 향상됩니다. 영향받는 위치에서 표준 라이브러리를 통해 throw하는 예외는 이제 다시 throw가 아니라 원래 throw 사이트에서 throw되는 것으로 표시됩니다. 모든 표준 라이브러리 catch 블록이 제거된 것은 아닙니다. MSVC의 이후 릴리스에서는 catch 블록 수가 줄어들 것으로 예상됩니다.

  • noexcept 함수 내부에서 조건부 throw로 인해 발생한 std::bitset의 최적이 아닌 Codegen은 throw 경로를 제외하여 수정되었습니다.

  • std::liststd::unordered_* 패밀리는 더 많은 곳에서 내부적으로 디버그가 아닌 반복기를 사용합니다.

  • 목록 노드를 할당 취소한 후 다시 할당하는 대신 가능한 경우 목록 노드를 다시 사용하도록 여러 std::list 멤버가 변경되었습니다. 예를 들어 이미 크기가 3인 list<int>의 경우 assign(4, 1729)를 호출하면 처음 세 개 목록 노드의 int 값을 덮어쓰고 값이 1729인 새 목록 노드 하나가 할당됩니다.

  • erase(begin(), end())에 대한 모든 표준 라이브러리 호출이 clear()로 변경되었습니다.

  • std::vector는 이제 특정 경우에 요소를 더 효율적으로 초기화하고 지웁니다.

  • std::variant에 대한 향상된 기능으로 인해 최적화 프로그램이 친화적으로 만들어져 좋은 코드를 생성하게 되었습니다. 코드 인라인은 std::visit를 사용하는 것이 좋습니다.

C++ IDE

Live Share C++ 지원

Live Share는 이제 C++를 지원하므로 개발자가 Visual Studio 또는 Visual Studio Code를 사용하여 실시간으로 공동 작업을 수행할 수 있습니다. 자세한 내용은 C++용 Live Share 알림: 실시간 공유 및 협업을 참조하세요.

템플릿 IntelliSense

이제 템플릿 모음은 모달 창 대신 피크 창 UI를 활용하고 중첩된 템플릿을 지원하며 모든 기본 인수를 피크 창에 미리 채웁니다. 자세한 내용은 Visual Studio 2019 Preview 2에 대한 템플릿 IntelliSense 향상을 참조하세요. 템플릿 모음에서 가장 최근에 사용됨 드롭다운을 사용하면 샘플 인수의 이전 세트 간을 신속하게 전환할 수 있습니다.

새로운 시작 창 환경

IDE를 시작할 때 새로운 시작 창이 표시됩니다. 이 창에는 최근에 사용한 프로젝트 열기, 소스 제어에서 코드 복제, 솔루션 또는 폴더로 로컬 코드 열기, 새 프로젝트 만들기 옵션이 있습니다. 새 프로젝트 대화 상자는 우선 검색, 필터링 가능 환경으로 철저히 점검되었습니다.

일부 프로젝트 템플릿에 대한 새 이름

업데이트된 새 프로젝트 대화 상자에 맞게 몇 개의 프로젝트 템플릿 이름과 설명이 수정되었습니다.

다양한 생산성 향상

Visual Studio 2019에는 코딩을 쉽고 직관적으로 만드는 데 도움이 되는 다음 기능이 포함됩니다.

  • 다음을 위한 빠른 수정 사항:
    • 누락된 #include 추가
    • NULL - nullptr
    • 누락된 세미콜론 추가
    • 누락된 네임스페이스 또는 범위 확인
    • 잘못된 간접 참조 피연산자 바꾸기(*&로, &*로)
  • 닫는 중괄호를 마우스로 가리켜서 블록에 대한 요약 정보 제공
  • 헤더/코드 파일 피킹
  • #include에서 정의로 이동하여 파일 열기

자세한 내용은 Visual Studio 2019 Preview 2의 C++ 생산성 향상을 참조하세요.

CMake 지원

  • CMake 3.14 지원

  • Visual Studio는 이제 CMakeGUI와 같은 외부 도구, 사용자 지정 메타 빌드 시스템 또는 cmake.exe 자체를 호출하는 빌드 스크립트에서 생성된 기존 CMake 캐시를 열 수 있습니다.

  • IntelliSense 성능이 개선되었습니다.

  • 새로운 설정 편집기는 CMakeSettings.json 파일을 수동으로 편집하기 위한 대안을 제공하고 CMakeGUI와 일부 패리티를 제공합니다.

  • Visual Studio는 Linux 머신에 호환되는 CMake 버전이 있는지 검색하여 Linux에서 CMake를 사용하여 C++ 개발을 부트스트랩하도록 도와줍니다. 그렇지 않은 경우 설치를 제공합니다.

  • 일치하지 않는 아키텍처 또는 호환되지 않는 CMake 생성기 설정과 같은 CMakeSettings의 호환되지 않는 설정은 JSON 편집기의 오류 표시선과 오류 목록의 오류를 표시합니다.

  • vcpkg integrate install이 실행된 후 IDE에서 열리는 CMake 프로젝트에 대해 vcpkg 도구 체인이 자동으로 검색되고 활성화됩니다. 이 동작은 CMakeSettings에서 빈 도구 체인 파일을 지정하여 해제할 수 있습니다.

  • 이제 CMake 프로젝트는 기본적으로 내 코드만 디버깅을 활성화합니다.

  • 이제 정적 분석 경고가 백그라운드에서 처리되어 CMake 프로젝트 편집기에 표시됩니다.

  • CMake 프로젝트에 대한 '시작' 및 '종료' 메시지를 명확하게 빌드 및 구성하고, Visual Studio의 빌드 진행 UI를 지원합니다. 또한 이제 출력 창에서 CMake 빌드 및 구성 메시지의 세부 수준을 사용자 지정하는 도구 > 옵션의 CMake 세부 정보 설정이 있습니다.

  • 이제 cmakeToolchain 설정이 CMakeSettings.json에서 지원되어 CMake 명령줄을 수동으로 수정하지 않고도 도구 체인을 지정할 수 있습니다.

  • 모두 빌드 메뉴 바로 가기 Ctrl+Shift+B입니다.

IncrediBuild 통합

IncrediBuild는 C++를 사용한 데스크톱 개발 워크로드의 선택적 구성 요소로 포함됩니다. IncrediBuild Build Monitor는 Visual Studio IDE에 완벽하게 통합됩니다. 자세한 내용은 Visualize your build with IncrediBuild’s Build Monitor and Visual Studio 2019(IncrediBuild Build Monitor 및 Visual Studio 2019를 사용하여 빌드 시각화)을 참조하세요.

디버깅

  • Windows에서 실행되는 C++ 애플리케이션의 경우 PDB 파일은 이제 별도의 64비트 프로세스로 로드됩니다. 이 변경으로 디버거 메모리 부족으로 인한 크래시 범위가 해결됩니다. 예를 들어 많은 수의 모듈과 PDB 파일을 포함하는 애플리케이션을 디버그하는 경우가 그렇습니다.

  • 검색은 조사식, 자동지역 창에서 사용할 수 있습니다.

C++를 사용한 Windows 데스크톱 개발

  • 이러한 C++ ATL/MFC 마법사는 더 이상 사용할 수 없습니다.

    • ATL COM+ 1.0 구성 요소 마법사
    • ATL Active Server Pages 구성 요소 마법사
    • ATL OLE DB 공급자 마법사
    • ATL 속성 페이지 마법사
    • ATL OLE DB 소비자 마법사
    • MFC ODBC 소비자
    • ActiveX 컨트롤의 MFC 클래스
    • TypeLib의 MFC 클래스

    이러한 기술에 대한 샘플 코드는 Microsoft Learn 및 VCSamples GitHub 리포지토리에 보관됩니다.

  • Windows 8.1 SDK(소프트웨어 개발 키트)는 Visual Studio 설치 관리자에서 더 이상 사용할 수 없습니다. C++ 프로젝트를 최신 Windows SDK로 업그레이드하는 것이 좋습니다. 8\.1에 대한 종속성이 높은 경우 Windows SDK 아카이브에서 다운로드할 수 있습니다.

  • Windows XP 대상은 최신 C++ 도구 세트에서 더 이상 사용할 수 없습니다. VS 2017 수준 MSVC 컴파일러 및 라이브러리가 있는 XP 대상은 여전히 지원되며 "개별 구성 요소"를 통해 설치할 수 있습니다.

  • 설명서에서는 Visual C++ 런타임 배포를 위한 병합 모듈의 사용을 적극적으로 권장하지 않습니다. MSM이 사용되지 않는 것으로 표시하는 이번 릴리스의 추가 단계를 진행하고 있습니다. VCRuntime 중앙 배포를 MSM에서 재배포 가능 패키지로 마이그레이션하는 것이 좋습니다.

C++를 사용한 모바일 개발(Android 및 iOS)

C++ Android 환경은 이제 기본적으로 Android SDK 25와 Android NDK 16b로 설정됩니다.

Clang/C2 플랫폼 도구 집합

Clang/C2 실험적 구성 요소가 제거되었습니다. C++ 표준을 완전하게 준수할 수 있도록 /permissive-/std:c++17 또는 Windows용 Clang/LLVM 도구 체인이 포함된 MSVC 도구 집합을 사용합니다.

코드 분석

단위 테스트

관리되는 C++ 테스트 프로젝트 템플릿을 더 이상 사용할 수 없습니다. 기존 프로젝트에서 관리형 C++ 테스트 프레임워크를 사용하여 진행할 수 있습니다. 새 단위 테스트의 경우, Visual Studio에서 템플릿(MSTest, Google Test) 또는 관리형 C# 테스트 프로젝트 템플릿을 제공하는 기본 프레임워크 중 하나를 사용하는 것이 좋습니다.