Visual Studio 버전의 Microsoft C/C++ 언어 규칙
Visual Studio(MSVC)의 Microsoft C/C++ 컴파일러에 대한 표준 규칙은 진행 중인 작업입니다. 다음은 ISO 표준 C 및 C++ 언어 및 Visual Studio 버전의 라이브러리 적합성에 대한 요약입니다. 각 C++ 컴파일러 및 표준 라이브러리 기능 이름은 기능을 설명하는 ISO 표준 C++ 제안 문서에 연결됩니다(게시 시점에 사용 가능한 경우). 지원됨 열에는 기능에 대한 지원이 먼저 표시되는 Visual Studio 버전이 나열됩니다.
규칙 향상에 대한 자세한 내용은 Visual Studio의 C++ 규칙 향상을 참조하세요. 기타 변경 내용의 목록은 새로워진 Visual Studio의 Visual C++ 기능을 참조하세요. 이전 버전의 규칙 변경 내용에 대해서는 Visual C++ change history(Visual C++ 주요 변경 내용) 및 2003~ 2015 Visual C++ 주요 변경 내용을 참조하세요. C++ 팀의 최신 뉴스를 보려면 C++ 팀 블로그를 방문하세요.
참고
Visual Studio 2015, 2017, 2019 및 2022에서 호환성이 손상되는 이진 변경이 없습니다. 자세한 내용은 Visual Studio 버전 간의 C++ 이진 호환성을 참조하세요.
C++ 컴파일러 기능
C++ 표준 라이브러리 기능
제품 버전별 표준 라이브러리 기능 및 버그 수정에 대한 자세한 목록은 GitHub Microsoft STL wiki 변경 로그 페이지에서 확인할 수 있습니다.
함께 나열된 문서 그룹은 하나 이상의 승인된 향상 또는 확장과 함께 표준 기능을 나타냅니다. 이러한 기능은 함께 구현됩니다.
C 표준 라이브러리 기능
기능 | 지원됨 |
---|---|
C99 표준 라이브러리 기능 | 지원됨 |
대체 맞춤법 매크로 <iso646.h> |
VS 2015 |
와이드 문자 지원 <wchar.h> 및 <wctype.h> |
VS 2015 |
<complex.h> 의 복잡한 지원 |
VS 2015에서 부분적으로 K |
형식 제네릭 수학 함수 <tgmath.h> |
VS 2019 16.8 2104 |
추가 부동 소수점 특성 <float.h> |
VS 2015 |
16진수 float printf 지정자 %A , %a |
VS 2015 |
확장된 정수 형식 <inttypes.h> , <stdint.h> |
VS 2015 |
vscanf 및 <wchar.h> 의 <stdio.h> 제품군 |
VS 2015 |
<math.h> 의 새 수학 함수 |
VS 2015 |
수학 라이브러리 오류 조건 처리(math_errhandling ) |
VS 2015 |
부동 소수점 환경 액세스 <fenv.h> |
VS 2015 |
%lf 에 대한 printf 변환 지정자 |
VS 2015 |
snprintf 함수의 <stdio.h> 패밀리 |
VS 2015 |
boolean 의 <stdbool.h> 형식 |
VS 2015 |
va_copy 매크로 |
VS 2015 |
추가 strftime 변환 지정자 |
VS 2015에서 부분적으로 L |
C11 표준 라이브러리 기능 | 지원됨 |
맞춤 지정자 <stdalign.h> |
VS 2019 16.8 C11, 2104 |
aligned_alloc |
아니요 M |
반환 지정자 <stdnoreturn.h> 없음 |
VS 2019 16.8 C11, 2104 |
스레딩 지원 <threads.h> |
예 |
원자성 지원 <stdatomic.h> |
실험적 |
char16_t , char32_t <uchar.h> |
VS 2019 16.8 C11 |
gets() 가 제거됨 |
VS 2019 16.8 C11, N |
gets_s() |
VS 2019 16.8 C11 |
경계 검사 인터페이스(*_s API) |
VS 2015에서 부분적으로 C11, O |
fopen "x" 옵션 |
VS 2019 16.8 C11 |
정적 어설션 | VS 2019 16.8 C11, 2104 |
quick_exit |
VS 2019 16.8 C11 |
<complex.h> 매크로 |
VS 2019 16.8 C11 |
부동 소수점 특성 <float.h> |
VS 2019 16.8 C11 |
C11 스레드 <threads.h> |
VS 2022 17.8 C11 |
지원되는 값
아니요 아직 구현되지 않았습니다.
부분적 구현이 완료되지 않았습니다. 자세한 내용은 참고 섹션을 참조하세요.
VS 2010 Visual Studio 2010에서 지원됩니다.
VS 2013 Visual Studio 2013에서 지원됩니다.
VS 2015 Visual Studio 2015(RTW)에서 지원됩니다.
VS 2015.2 및 VS 2015.3은 각각 Visual Studio 2015 업데이트 2와 Visual Studio 2015 업데이트 3에서 지원되는 기능을 나타냅니다.
VS 2017 15.0 Visual Studio 2017 버전 15.0(RTW)에서 지원됩니다.
VS 2017 15.3 Visual Studio 2017 버전 15.3에서 지원됩니다.
VS 2017 15.5 Visual Studio 2017 버전 15.5에서 지원됩니다.
VS 2017 15.7 Visual Studio 2017 버전 15.7에서 지원됩니다.
VS 2019 16.0 Visual Studio 2019 버전 16.0(RTW)에서 지원됩니다.
VS 2019 16.1 Visual Studio 2019 버전 16.1에서 지원됩니다.
VS 2019 16.2 Visual Studio 2019 버전 16.2에서 지원됩니다.
VS 2019 16.3 Visual Studio 2019 버전 16.3에서 지원됩니다.
VS 2019 16.4 Visual Studio 2019 버전 16.4에서 지원됩니다.
VS 2019 16.5 Visual Studio 2019 버전 16.5에서 지원됩니다.
VS 2019 16.6 Visual Studio 2019 버전 16.6에서 지원됩니다.
VS 2019 16.7 Visual Studio 2019 버전 16.7에서 지원됩니다.
VS 2019 16.8 Visual Studio 2019 버전 16.8에서 지원됩니다.
VS 2019 16.9 Visual Studio 2019 버전 16.9에서 지원됩니다.
VS 2019 16.10 Visual Studio 2019 버전 16.10에서 지원됩니다.\
VS 2022 17.0 Visual Studio 2022 버전 17.0에서 지원됩니다.
VS 2022 17.1 Visual Studio 2022 버전 17.1에서 지원됩니다.
VS 2022 17.2 Visual Studio 2022 버전 17.2에서 지원됩니다.
VS 2022 17.3 Visual Studio 2022 버전 17.3에서 지원됩니다.
VS 2022 17.4 Visual Studio 2022 버전 17.4에서 지원됩니다.
VS 2022 17.5 Visual Studio 2022 버전 17.5에서 지원됩니다.
주의
A /std:c++14
모드에서는 동적 예외 사양이 구현되지 않은 상태로 남아 있으며 throw()
는 여전히 __declspec(nothrow)
의 동의어로 처리됩니다. C++17에서 동적 예외 사양은 P0003R5에 의해 대부분 제거되었으므로 하나(throw()
는 사용되지 않음)를 제외하고는 noexcept
의 동의어로 작동해야 합니다. /std:c++17
모드에서 MSVC는 이제 noexcept
, 즉 종료를 통한 적용과 동일한 동작을 throw()
에 제공하여 표준을 준수합니다.
컴파일러 옵션 /Zc:noexceptTypes
는 __declspec(nothrow)
의 이전 동작을 요청합니다. 이후 버전의 C++에서는 throw()
가 제거될 가능성이 높습니다. 표준 및 Microsoft 구현에서 이러한 변경 사항에 대한 응답으로 코드를 마이그레이션하는 것을 돕기 위해, 예외 사양 문제에 대한 새로운 컴파일러 경고가 /std:c++17
및 /permissive-
아래에 추가되었습니다.
B Visual Studio 2017 버전 15.7의 /permissive-
모드에서 지원됩니다. 자세한 내용은 Two-phase name lookup support comes to MSVC
를 참조하세요.
C Visual Studio 2019 버전 16.6 이상에서는 컴파일러가 /Zc:preprocessor
옵션을 통해 표준 C99 전처리기를 완전히 구현합니다. (Visual Studio 2017 버전 15.8부터 16.5에서 컴파일러는 /experimental:preprocessor
컴파일러 옵션을 통해 표준 C99 전처리기를 지원합니다.) 이 옵션은 컴파일러 옵션 /std:c11
또는 /std:c17
가 지정된 경우 기본적으로 설정되어 있습니다.
D /std:c++14
아래에서 표시하지 않을 수 있는 경고 C4984
로 지원됩니다.
E 구현은 C++20 표준 라이브러리를 지원하는 데 충분합니다. 완전한 구현을 위해서는 이진 주요 변경 내용이 필요 합니다.
/std:c++17
이상 컴파일러 옵션이 지정되면 F 기능이 제거됩니다. 이러한 기능을 다시 사용하도록 설정하려면(최신 언어 모드로 쉽게 전환하기 위해) _HAS_AUTO_PTR_ETC
, _HAS_FUNCTION_ALLOCATOR_SUPPORT
, _HAS_OLD_IOSTREAMS_MEMBERS
및 _HAS_UNEXPECTED
매크로를 사용합니다.
G C++17의 병렬 알고리즘 라이브러리가 완료되었습니다. 이는 모든 경우에서 모든 알고리즘이 병렬 처리된다는 것을 의미하지는 않습니다. 가장 중요한 알고리즘은 병렬 처리되었습니다. 구현이 알고리즘을 병렬 처리하지 않는 경우에도 실행 정책 서명이 제공됩니다. 중앙 내부 헤더인 <yvals_core.h>
에는 다음과 같은 "병렬 알고리즘 노트"가 있습니다. C++은 구현 시 직렬 알고리즘에 대한 호출로서 병렬 알고리즘을 구현할 수 있습니다. 이 구현은 몇 가지 일반적인 알고리즘 호출을 병렬 처리하지만 전부는 아닙니다.
다음 알고리즘은 병렬 처리됩니다.
adjacent_difference
,adjacent_find
,all_of
,any_of
,count
,count_if
,equal
,exclusive_scan
, ,find
,find_end
,find_first_of
,find_if
,find_if_not
,for_each_n
for_each
,inclusive_scan
,is_heap
is_heap_until
,is_partitioned
,mismatch
none_of
is_sorted
is_sorted_until
,remove_if
remove
replace
reduce
search
replace_if
set_difference
partition
search_n
,set_intersection
,sort
,stable_sort
,transform
, ,transform_inclusive_scan
transform_exclusive_scan
transform_reduce
이러한 알고리즘은 현재 병렬 처리되지 않습니다.
- 이러한 알고리즘은 대상 하드웨어에서 눈에 띄는 병렬 처리 성능 향상을 보여 줍니다. 분기 없이 요소를 복사하거나 순열하기만 하는 모든 알고리즘은 일반적으로 메모리 대역폭이 제한됩니다.
copy
,copy_n
,fill
,fill_n
,move
,reverse
,reverse_copy
,rotate
,rotate_copy
shift_left
shift_right
swap_ranges
- 위의 범주에서와 같이 이러한 알고리즘에서는 사용자 병렬 처리 요구 사항에 대해 혼란이 있을 수 있습니다.
generate
,generate_n
- 이러한 알고리즘의 효과적인 병렬 처리는 가능하지 않을 수 있습니다.
partial_sort
,partial_sort_copy
- 이러한 알고리즘은 아직 평가되지 않았습니다. 향후 릴리스에서는 병렬 처리가 구현될 수 있습니다.
copy_if
,includes
,inplace_merge
,lexicographical_compare
,max_element
,merge
, ,min_element
,minmax_element
,nth_element
, ,remove_copy_if
set_union
replace_copy
unique
remove_copy
replace_copy_if
set_symmetric_difference
stable_partition
partition_copy
unique_copy
H 이것은 완전히 새로운 구현이기 때문에 이전의 std::experimental
버전과 호환되지 않으며, symlink 지원, 버그 수정 및 표준 필수 동작의 변경이 필요합니다. 현재, <filesystem>
에서는 새 std::filesystem
과 이전 std::experimental::filesystem
을 모두 제공합니다. <experimental/filesystem>
헤더는 이전의 실험적 구현만 제공합니다. 실험적 구현은 다음 ABI의 최신 라이브러리 릴리스에서 제거될 예정입니다.
J std::byte
는 /std:c++17
이상에서 사용하도록 설정되지만 경우에 따라 Windows SDK 헤더와 충돌할 수 있으므로 세분화된 옵트아웃 매크로가 있습니다. 사용하지 않도록 설정하려면 _HAS_STD_BYTE
를 0
으로 정의합니다.
K MSVC는 _Complex
키워드 또는 네이티브 복합 형식을 지원하지 않습니다. 유니버설 CRT <complex.h>
는 구현 관련 매크로를 사용하여 동일한 효과를 얻습니다. 자세한 내용은 C 복합 수학 지원을 참조하세요.
L 유니버설 CRT는 strftime
E
및 O
대체 변환 한정자를 구현하지 않습니다. 이러한 한정자는 무시됩니다(예를 들어 %Oe
는 %e
와 동일하게 동작함). 한정자는 기본 로캘 API에서 지원되지 않습니다.
M 유니버설 CRT는 C11 aligned_alloc
를 구현하지 않으며 _aligned_malloc
및 _aligned_free
를 제공합니다. Windows 운영 체제에서 관련 할당을 지원하지 않기 때문에 이 기능은 구현될 가능성이 낮습니다.
N 선언이 제거되지만 함수의 내보내기는 이전 버전과의 호환성을 위해 유지됩니다.
O 특정 경계 검사 함수가 구현되지 않거나, 다른 서명을 포함하거나, C11 또는 C17 표준에 속하지 않습니다. abort_handler_s
, ignore_handler_s
, memset_s
, set_constraint_handler_s
, snprintf_s
, snwprintf_s
, strerrorlen_s
, vsnwprintf_s
함수는 구현되지 않습니다. gmtime_s
, localtime_s
, qsort_s
, strtok_s
, vsnprintf_s
, wcstok_s
함수는 다른 시그니처를 포함합니다. clearerr_s
, fread_s
함수는 표준에 표시되지 않습니다.
P Visual Studio 2019 버전 16.10에 지원이 추가되었습니다. Visual Studio 2022 버전 17.0에서 Clang 지원이 추가되었습니다.
Q declare_reachable
, undeclare_reachable
, declare_no_pointers
, undeclare_no_pointers
, get_pointer_safety
를 제거합니다. 이전에는 이러한 함수가 영향을 미치지 않았습니다.
R 일반적인 소스 주요 변경 내용입니다. 하지만 이전에 런타임에 정의되지 않은 동작이 있었던 코드는 이제 컴파일러 오류로 거부됩니다.
S 입력 범위 어댑터 및 counted_iterator
는 VS 2022 17.0에서 구현됩니다. Visual Studio 2019 버전 16.11에 대한 향후 업데이트는 이러한 변경 내용을 통합할 예정입니다.
T <stdatomic.h>
는 현재 C++(/std:c++latest
)로 컴파일되는 경우에만 지원됩니다. C(/std:c11
및 /std:c17
)로 컴파일되는 경우에는 아직 지원되지 않습니다
14 이러한 C++17 및 C++20 기능은 /std:c++14
(기본값)를 지정한 경우에도 항상 활성화됩니다. 이는 /std
옵션을 도입하기 전에 기능이 구현되었거나 조건부 구현이 바람직하지 않게 복잡했기 때문입니다.
17 이 기능은 /std:c++17
이상의 컴파일러 옵션을 통해 사용하도록 설정됩니다.
20 Visual Studio 2019 버전 16.10까지 이러한 기능은 /std:c++latest
컴파일러 옵션으로 설정됩니다. 이러한 기능을 사용하도록 설정하기 위해 Visual Studio 2019 버전 16.11에는 /std:c++20
컴파일러 옵션이 추가되었습니다.
20abi C++20 표준, <format>
, <chrono>
의 서식 지정 부분(<format>
에 의존), <ranges>
의 범위 팩토리 및 범위 어댑터(view
개념이 필요한 모든 것)는 /std:c++latest
에서만 사용 가능합니다. 더 이상의 ABI 호환성이 손상되는 변경이 필요하지 않다는 WG21과의 합으에 도달한 후 /std:c++20
에서 이러한 기능을 사용할 예정입니다. <chrono>
의 나머지 부분과 범위에 적용되는 알고리즘은 Visual Studio 2019 버전 16.11부터 /std:c++20
컴파일러 옵션에서 사용할 수 있습니다.
23 Visual Studio 2022 버전 17.0까지 이러한 기능은 /std:c++latest
컴파일러 옵션으로 설정됩니다.
C11 C11 및 C17에 대한 컴파일러 지원에는 Visual Studio 2019 버전 16.8 이상이 필요합니다. 명시된 경우를 제외하고 C11 및 C17 라이브러리 지원에는 Windows SDK 빌드 10.0.20211.0 이상이 필요합니다. C11 및 C17에 대한 지원을 설치하는 방법에 대한 자세한 내용은 Visual Studio에 C11 및 C17 지원 설치를 참조하세요.
DR 이러한 기능은 모든 C++ /std
컴파일러 옵션 모드에서 사용하도록 설정됩니다. C++ 표준 위원회는 이 변경 사항을 C++11 및 모든 이후 버전에 대한 소급 결함 보고서로 채택했습니다.
2104 이 기능에 대한 C11 라이브러리 지원을 위해서는 Windows SDK 빌드 10.0.20348.0(버전 2104) 이상이 필요합니다.
참고 항목
C++ 언어 참조
C++ 표준 라이브러리
Visual Studio의 C++ 규칙 향상
새로워진 Visual Studio의 Visual C++ 기능
Visual C++ 2003~2015 변경 내용
Visual C++ 2003~2015의 새로운 기능
C++ team blog(C++ 팀 블로그)