컴파일러에서 구현 한 C ++ 표준의 버전을 어떻게 결정합니까? 내가 아는 한 다음은 내가 알고있는 표준입니다.
- C ++ 03
- C ++ 98
답변
내 지식으로는 이것을 할 전체적인 방법이 없습니다. 크로스 플랫폼 / 다중 컴파일러 지원 라이브러리의 헤더를 살펴보면 항상 컴파일러 특정 구조를 사용하여 이러한 사항을 결정 하는 많은 정의를 찾을 수 있습니다.
/*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
.
- C ++에서 98-C를 사전 ++
__cplusplus
입니다1
. - C ++ 98 :
__cplusplus
입니다199711L
. - C ++ 98 + TR1 : 이것은 C ++ 98로 읽히고 내가 아는 것을 확인할 방법이 없습니다.
- C ++ 11 :
__cplusplus
입니다201103L
. - C ++ 14 :
__cplusplus
입니다201402L
. - C ++ 17 :
__cplusplus
입니다201703L
.
컴파일러가 이전 버전 gcc
일 수있는 경우 컴파일러 특정 해커에 의존하거나 (버전 매크로를보고, 구현 된 기능이있는 테이블과 비교) Boost.Config ( 관련 매크로 를 제공하는 )를 사용해야 합니다 . 이것의 장점은 실제로 새로운 표준의 특정 기능을 선택하고 기능이 누락 된 경우 해결 방법을 작성할 수 있다는 것입니다. 일부 컴파일러는 C ++ 11을 구현한다고 주장하지만 기능의 일부만 제공하기 때문에 이것은 종종 도매 솔루션보다 선호됩니다.
Stdcxx Wiki 는 C ++ 0x 기능의 컴파일러 지원을위한 포괄적 인 매트릭스를 호스팅 합니다 (기능을 직접 확인하려는 경우).
불행하게도, 더 많은 기능을 검사 미세 그레인 (예를 들어 같은 개인 라이브러리 함수 std::copy_if
)가 컴파일 및 올바른 결과를 생성하는 경우에만 응용 프로그램 (기능과 실행 코드, 검사의 빌드 시스템에서 수행 할 수 있습니다 – autoconf
촬영의 경우 선택의 도구입니다 이 경로).
답변
버전을 확인하려면 다음 코드를 실행하십시오.
#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";
}
답변
달성하려는 목표에 따라 Boost.Config 가 도움이 될 수 있습니다. 표준 버전 감지 기능은 제공하지 않지만 특정 언어 / 컴파일러 기능 지원 여부를 확인할 수있는 매크로를 제공합니다.
답변
__cplusplus
C ++ 0x에서 __cplusplus 매크로는 현재 199711L과 다른 (보다 큰) 값으로 설정됩니다.
답변
__cplusplus
제안 된대로 사용하십시오 . Microsoft 컴파일러에 대한 단 하나의 참고 사항입니다. Zc:__cplusplus
컴파일러 스위치를 사용하여__cplusplus
출처 https://devblogs.microsoft.com/cppblog/msvc-now-correctly-reports-__cplusplus/