/std
(언어 표준 버전 지정)
C 또는 C++ 언어 표준의 지정된 버전에서 지원되는 C 및 C++ 언어 기능을 사용하도록 설정합니다.
구문
/std:c++14
/std:c++17
/std:c++20
/std:c++latest
/std:c11
/std:c17
/std:clatest
설명
/std
옵션은 Visual Studio 2017 이상에서 사용할 수 있습니다. 코드를 컴파일하는 동안 사용하도록 설정되는 버전별 ISO C 또는 C++ 프로그래밍 언어 표준 기능을 제어하는 데 사용됩니다. 이 옵션을 사용하면 특정 새 언어 및 라이브러리 기능(특정 버전의 언어 표준을 준수하는 기존 코드를 손상시킬 수 있는 기능)에 대한 지원을 사용하지 않도록 설정할 수 있습니다.
Visual Studio 2017 이상 버전의 Microsoft C++ 컴파일러는 C++14(/std:c++14
) 이전의 C++ 표준 모드를 지원하지 않습니다. 이런 지원은 예정되어 있지 않습니다. 불완전한 해결 방법으로 최신 표준의 기능을 구현하지 않은 이전 Visual C++ 컴파일러 도구 집합을 사용할 수 있습니다. Visual Studio에서 이전 컴파일러 도구 집합을 설치하고 사용하는 방법에 대한 자세한 내용은 Visual Studio에서 네이티브 멀티 대상 지정을 사용하여 이전 프로젝트 빌드를 참조하세요.
C++ 표준 지원
C++ 컴파일 중에 적용되는 /std
옵션은 _MSVC_LANG
전처리기 매크로를 사용하여 검색할 수 있습니다. 자세한 내용은 전처리기 매크로를 참조하세요.
Important
일부 기존 코드는 199711L
인 매크로 __cplusplus
의 값에 의존하기 때문에 MSVC 컴파일러는 /Zc:__cplusplus
을(를) 설정하여 명시적으로 옵트인하지 않는 한 이 매크로의 값을 변경하지 않습니다. __cplusplus
을(를) 적절한 값으로 설정하려면 /Zc:__cplusplus
및 /std
옵션을 지정합니다.
/std:c++14
/std:c++14
옵션을 사용하면 MSVC 컴파일러에서 구현된 C++14 표준 관련 기능을 사용할 수 있습니다. 이 옵션은 C++로 컴파일된 코드의 기본값입니다. Visual Studio 2015 업데이트 3부터 사용할 수 있습니다.
이 옵션은 최신 버전의 언어 표준에서 변경되었거나 새로운 기능에 대한 컴파일러 및 표준 라이브러리 지원을 사용하지 않도록 설정합니다. 그러나 이전 MSVC 컴파일러 릴리스에 이미 구현된 일부 C++17 기능은 사용하지 않도록 설정되지 않습니다. 자세한 내용은 Microsoft C/C++ 언어 규칙을 참조하세요. 이 표는 /std:c++14
를 지정할 때 사용하도록 설정되는 C++17 기능을 나타냅니다.
Visual Studio 2015 업데이트 2 또는 이전 버전에서 사용 가능한 기능에 이미 종속된 사용자에 대한 호환성이 손상되는 변경을 방지하기 위해 /std:c++14
옵션이 지정된 경우 다음 기능은 사용하도록 설정된 상태로 유지됩니다.
/std:c++17
/std:c++17
옵션을 사용하면 C++17 표준 관련 기능과 동작을 사용하도록 설정할 수 있습니다. 이는 MSVC 컴파일러에서 구현된 전체 C++17 기능 집합을 사용하도록 설정합니다. 이 옵션은 C++17 이후에 새로 추가되거나 변경된 기능에 대한 컴파일러 및 표준 라이브러리 지원을 사용하지 않도록 설정합니다. 특히 C++ 표준 및 작업 초안 버전의 C++17 이후 변경 내용을 사용하지 않도록 설정합니다. C++ 표준의 소급 결함 업데이트를 사용하도록 설정합니다. 이 옵션은 Visual Studio 2017 버전 15.3부터 사용할 수 있습니다.
MSVC 컴파일러 버전 또는 업데이트 수준에 따라 C++17 기능은 /std:c++17
옵션을 지정할 때 완전히 구현되지 않거나 완전히 호환되지 않을 수 있습니다. 릴리스 버전별 Visual C++의 C++ 언어 적합성에 대한 개요는 Microsoft C/C++ 언어 적합성을 참조하세요.
/std:c++20
/std:c++20
옵션을 사용하면 C++20 표준 관련 기능과 동작을 사용하도록 설정할 수 있습니다. Visual Studio 2019 버전 16.11부터 사용할 수 있으며 MSVC 컴파일러에서 구현한 C++20 기능의 전체 집합을 사용할 수 있습니다. Visual Studio 2022 버전 17.0은 표준 게시 직후 해당 기능의 최신 변경으로 인해 C++20 <chrono>
서식 확장 및 범위 팩터리 및 범위 어댑터를 <ranges>
/std:c++20
지원하지 std::format
않습니다.
/std:c++20
옵션은 C++20 이후에 새로 추가되거나 변경된 기능에 대한 컴파일러 및 표준 라이브러리 지원을 사용하지 않도록 설정합니다. 특히 C++ 표준 및 작업 초안 버전에서 C++20 이후 변경 내용을 사용하지 않도록 설정합니다. C++ 표준의 소급 결함 업데이트를 사용하도록 설정합니다.
이 /std:c++20
옵션은 명시적으로 재정의하지 않는 한 제공 /permissive-
된 표준 규칙 모드를 /permissive
사용하도록 설정합니다.
/std:c++latest
/std:c++latest
옵션을 사용하면 현재 구현된 모든 컴파일러와 다음 드래프트 표준을 위해 제안된 표준 라이브러리 기능은 물론 일부 진행 중인 기능과 실험적인 기능을 사용할 수 있습니다. 이 옵션은 Visual Studio 2015 업데이트 3부터 사용할 수 있습니다.
MSVC 컴파일러 버전 또는 업데이트 수준에 따라 C++17, C++20 또는 제안된 C++23 기능은 /std:c++latest
옵션을 지정할 때 완전히 구현되지 않거나 완전히 준수되지 않을 수 있습니다. 표준 적합성을 최대화하려면 최신 버전의 Visual Studio를 사용하는 것이 좋습니다. 릴리스 버전별 Visual C++의 C++ 언어 및 라이브러리 적합성에 대한 개요는 Microsoft C/C++ 언어 적합성을 참조하세요.
버전 16.11 이전의 Visual Studio 2019 버전에서는 C++20의 모든 컴파일러 및 표준 라이브러리 기능을 사용하도록 설정하려면 /std:c++latest
가 필요합니다.
Visual Studio 2019 버전 16.8 /std:c++latest
이후 이 옵션은 명시적으로 재정의하지 않는 한 제공되는 /permissive-
표준 규칙 모드를 /permissive
사용하도록 설정했습니다.
지원되는 언어 및 라이브러리 기능 목록은 Visual Studio의 C++에 대한 새로운 기능을 참조하세요.
/std:c++latest
옵션은 /experimental
스위치로 보호되는 기능을 사용하지 않지만 해당 기능을 사용하도록 설정해야 할 수 있습니다.
참고 항목
/std:c++latest
에 의해 사용하도록 설정된 컴파일러 및 라이브러리 기능은 향후 C++ 표준에 나타날 수 있습니다. 승인되지 않은 기능은 예고 없이 갑자기 변경되거나 제거될 수 있고, 있는 그대로 제공됩니다.
C 표준 지원
/TC
또는 /Tc
컴파일러 옵션을 사용하여 Microsoft C 컴파일러를 호출할 수 있습니다. /TP
또는 /Tp
옵션으로 재정의되지 않는 한 이는 .c
파일 확장자를 가진 코드에 기본적으로 사용됩니다. 기본 C 컴파일러(즉, /std:c11
또는 /std:c17
이 지정되지 않은 경우의 컴파일러)는 ANSI C89를 구현하지만 여러 Microsoft 확장을 포함하며 그중 일부는 ISO C99의 일부입니다. C89에 대한 일부 Microsoft 확장은 /Za
컴파일러 옵션으로 사용하지 않도록 설정할 수 있지만 다른 확장은 여전히 유효합니다. 엄격한 C89 적합성을 지정하는 것은 불가능합니다. 컴파일러는 C99의 여러 필수 기능을 구현하지 않으므로 C99 적합성을 지정하는 것도 불가능합니다.
/std:c11
/std:c11
옵션은 ISO C11 적합성을 사용하도록 설정합니다. Visual Studio 2019 버전 16.8부터 사용 가능합니다.
/std:c17
/std:c17
옵션은 ISO C17 적합성을 사용하도록 설정합니다. Visual Studio 2019 버전 16.8부터 사용 가능합니다.
이러한 표준을 지원하려면 새 전처리기가 필요하기 때문에 /std:c11
및 /std:c17
컴파일러 옵션은 /Zc:preprocessor
옵션을 자동으로 설정합니다. C11 또는 C17에 레거시(레거시) 전처리기를 사용하려면 /Zc:preprocessor-
컴파일러 옵션을 명시적으로 설정해야 합니다. /Zc:preprocessor-
옵션을 설정하면 예기치 않은 동작이 발생할 수 있으므로 권장되지 않습니다.
참고 항목
릴리스 당시 Visual Studio 2019 버전 16.10을 통해 Visual Studio에서 설치한 Windows SDK 및 UCRT 라이브러리는 아직 C11 및 C17 코드를 지원하지 않습니다. 업데이트된 버전의 Windows SDK 및 UCRT가 필요합니다. 자세한 내용 및 설치 지침은 Visual Studio에서 C11 및 C17 지원 설치를 참조하세요.
/std:c11
또는 /std:c17
을 지정하면 MSVC는 표준에서 요구하는 C11 및 C17의 모든 기능을 지원합니다. /std:c11
및 /std:c17
컴파일러 옵션을 사용하면 다음 기능을 지원할 수 있습니다.
_Noreturn
및 <stdnoreturn.h>_Alignas
,_Alignof
및 <stdalign.h>_Generic
및 <tgmath.h>
IDE는 원본 파일에 .c
파일 확장자가 있거나 /TC
또는 /Tc
컴파일러 옵션을 지정할 때 IntelliSense 및 코드 강조 표시에 C 설정을 사용합니다. 현재 C의 IntelliSense는 키워드 _Alignas
, _Alignof
, _Noreturn
및 _Static_assert
를 강조 표시하지만 표준 헤더(alignas
, alignof
, noreturn
및 static_assert
)에 정의된 동등한 매크로가 아닙니다.
C17은 주로 ISO C11의 버그 수정 릴리스이므로 C11에 대한 MSVC 지원에는 이미 모든 관련 결함 보고서가 포함되어 있습니다. __STDC_VERSION__
매크로를 제외하면 C11 버전과 C17 버전 간에 차이가 없습니다. C11의 경우 201112L
로, C17의 경우 201710L
로 확장됩니다.
컴파일러는 ISO C11의 대부분의 선택적 기능을 지원하지 않습니다. C11의 이러한 선택적 기능 중 일부는 MSVC가 아키텍처상의 이유로 구현하지 않은 C99의 필수 기능이었습니다. __STDC_NO_VLA__
와 같은 기능 테스트 매크로를 사용하여 개별 기능에 대한 컴파일러 지원 수준을 검색할 수 있습니다. C 관련 미리 정의된 매크로에 대한 자세한 내용은 미리 정의된 매크로를 참조하세요.
적합한 다중 스레딩, 원자성 또는 복소수 지원이 없습니다.
Windows 힙 구현으로 인해
aligned_alloc
지원이 누락되었습니다. 대안은_aligned_malloc
를 사용하는 것입니다.이 변경으로 인해 ABI가 중단될 수 있으므로 결함 보고서 400 지원은 현재
realloc
에 대해 구현되지 않습니다.VLA(변수 길이 배열) 지원은 계획되지 않습니다. VLA는 더 이상 사용되지 않으며 제거될 예정인
gets
와 유사한 공격 벡터를 제공합니다.
/std:clatest
/std:clatest
옵션은 C++ 컴파일러의 /std:c++latest
스위치와 같이 동작합니다. 이 스위치를 사용하면 현재 구현된 모든 컴파일러와 다음 C 표준 초안을 위해 제안된 표준 라이브러리 기능은 물론 일부 진행 중인 기능과 실험적인 기능을 사용할 수 있습니다.
자세한 내용은 Microsoft C/C++ 언어 적합성의 C 표준 라이브러리 기능 섹션을 참조하세요.
Visual Studio 개발 환경에서 이 컴파일러 옵션을 설정하려면
프로젝트의 속성 페이지 대화 상자를 엽니다. 자세한 내용은 Visual Studio에서 컴파일러 및 빌드 속성 설정을 참조합니다.
구성 속성>C/C++>언어 속성 페이지를 선택합니다.
C++ 언어 표준(또는 C의 경우 C 언어 표준)의 드롭다운 컨트롤에서 지원할 언어 표준을 선택한 다음 확인 또는 적용을 선택하여 변경 내용을 저장합니다.