컴파일러에서 구현 한 C ++ 표준의 버전을 어떻게 결정합니까? 내가 아는 한 다음은 내가 알고있는 표준입니다.
- C ++ 03
- C ++ 98
c++-faq
태그에는 통과해야하는 실제 전제 조건 "요청 횟수" 가 없습니다 . 그것은 사물의 형식과 일반성에 관한 것입니다.
컴파일러에서 구현 한 C ++ 표준의 버전을 어떻게 결정합니까? 내가 아는 한 다음은 내가 알고있는 표준입니다.
c++-faq
태그에는 통과해야하는 실제 전제 조건 "요청 횟수" 가 없습니다 . 그것은 사물의 형식과 일반성에 관한 것입니다.
답변:
내 지식으로는 이것을 할 전체적인 방법이 없습니다. 크로스 플랫폼 / 다중 컴파일러 지원 라이브러리의 헤더를 살펴보면 항상 컴파일러 특정 구조를 사용하여 이러한 사항을 결정 하는 많은 정의를 찾을 수 있습니다.
/*Define Microsoft Visual C++ .NET (32-bit) compiler */
#if (defined(_M_IX86) && defined(_MSC_VER) && (_MSC_VER >= 1300)
...
#endif
/*Define Borland 5.0 C++ (16-bit) compiler */
#if defined(__BORLANDC__) && !defined(__WIN32__)
...
#endif
사용하는 모든 컴파일러에 대해 이러한 정의를 직접 수행해야 할 것입니다.
Bjarne Stroustrup C ++ 0x FAQ에서 :
__cplusplus
C ++ 0x에서 매크로
__cplusplus
는 현재와 다른 (보다 큰) 값으로 설정됩니다199711L
.
이것이 원하는만큼 도움이되지는 않지만. gcc
(분명히 거의 10 년 동안)이 값을로 설정하여 gcc 4.7.0이 나왔을 때 수정 될 때1
까지 하나의 주요 컴파일러를 배제 했습니다 .
다음은 C ++ 표준이며 다음에서 기대할 수있는 가치입니다 __cplusplus
.
__cplusplus
입니다 1
.__cplusplus
입니다 199711L
.__cplusplus
입니다 201103L
.__cplusplus
입니다 201402L
.__cplusplus
입니다 201703L
.컴파일러가 이전 버전 gcc
일 수있는 경우 컴파일러 특정 해커에 의존하거나 (버전 매크로를보고, 구현 된 기능이있는 테이블과 비교) Boost.Config ( 관련 매크로 를 제공하는 )를 사용해야 합니다 . 이것의 장점은 실제로 새로운 표준의 특정 기능을 선택하고 기능이 누락 된 경우 해결 방법을 작성할 수 있다는 것입니다. 일부 컴파일러는 C ++ 11을 구현한다고 주장하지만 기능의 일부만 제공하기 때문에 이것은 종종 도매 솔루션보다 선호됩니다.
Stdcxx Wiki 는 C ++ 0x 기능의 컴파일러 지원을위한 포괄적 인 매트릭스를 호스팅 합니다 (기능을 직접 확인하려는 경우).
불행하게도, 더 많은 기능을 검사 미세 그레인 (예를 들어 같은 개인 라이브러리 함수 std::copy_if
)가 컴파일 및 올바른 결과를 생성하는 경우에만 응용 프로그램 (기능과 실행 코드, 검사의 빌드 시스템에서 수행 할 수 있습니다 - autoconf
촬영의 경우 선택의 도구입니다 이 경로).
__cplusplus
는 VS 15.7에서만 부분적으로 수정 되었습니다. 그들의 참조 비주얼 C ++ 팀 블로그
버전을 확인하려면 다음 코드를 실행하십시오.
#include<iostream>
int main() {
if (__cplusplus == 201703L) std::cout << "C++17\n";
else if (__cplusplus == 201402L) std::cout << "C++14\n";
else if (__cplusplus == 201103L) std::cout << "C++11\n";
else if (__cplusplus == 199711L) std::cout << "C++98\n";
else std::cout << "pre-standard C++\n";
}
/Zc:__cplusplus
)
/Zc:__cplusplus
깃발 을 사용하는 방법에 대한 지식을 가정하는 것 같습니다 . std::cout << /Zc:__cplusplus;
물론 콜론과 슬래시가 변수 이름의 일부가 될 수 없기 때문에 그럴 수 없습니다 . 이 작업을 수행하는 방법을 설명 할 수 있습니까? 감사.
달성하려는 목표에 따라 Boost.Config 가 도움이 될 수 있습니다. 표준 버전 감지 기능은 제공하지 않지만 특정 언어 / 컴파일러 기능 지원 여부를 확인할 수있는 매크로를 제공합니다.
__cplusplus
C ++ 0x에서 __cplusplus 매크로는 현재 199711L과 다른 (보다 큰) 값으로 설정됩니다.
__cplusplus
제안 된대로 사용하십시오 . Microsoft 컴파일러에 대한 단 하나의 참고 사항입니다. Zc:__cplusplus
컴파일러 스위치를 사용하여__cplusplus
출처 https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/
__STDC__
정의 여부 와 그 값은 C ++에서 구현 정의됩니다.
일반적으로 사용한다 __cplusplus
C ++ (17)를 감지하는 정의하지만 기본적으로 마이크로 소프트 컴파일러가 제대로 그 매크로를 정의하지 않습니다를 참조 https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/은 - 당신이 필요 /Zc:__cplusplus
스위치 를 포함하도록 프로젝트 설정을 수정 하거나 다음과 같은 구문을 사용할 수 있습니다.
#if ((defined(_MSVC_LANG) && _MSVC_LANG >= 201703L) || __cplusplus >= 201703L)
//C++17 specific stuff here
#endif