[c++] C ++ 11 지원을 어떻게 확인합니까?

컴파일러가 C ++ 11의 특정 기능을 지원하는 경우 컴파일 타임에 감지하는 방법이 있습니까? 예를 들면 다음과 같습니다.

#ifndef VARIADIC_TEMPLATES_SUPPORTED

#error "Your compiler doesn't support variadic templates.  :("

#else

template <typename... DatatypeList>
class Tuple
{
    // ...
}

#endif



답변

__cplusplusC ++ 컴파일러가 지원되는 C ++ 표준 버전으로 설정해야하는 상수가 있습니다. 이를 참조

#if __cplusplus <= 199711L
  #error This library needs at least a C++11 compliant compiler
#endif

Visual Studio 2010 SP1에서는 199711L로 설정되어 있지만 모든 C ++ 11 변경 사항이있는 표준 C ++ 라이브러리에 비해 (일부) 컴파일러 수준 지원 만있는 경우 공급 업체가 이미이를 늘릴만큼 과감한 것인지는 모르겠습니다. .

따라서 다른 답변에서 언급 된 Boost의 정의는 예를 들어 C ++ 11 스레드 및 표준의 다른 특정 부분에 대한 지원이 있는지 알아내는 유일한 방법입니다.


답변

C ++ 11 표준 (§iso.16.8)에 명시된대로 :

__cplusplus 라는 이름 은 C ++ 번역 단위를 컴파일 할 때 값 201103L로 정의됩니다 .

해당 매크로의 값을 사용하여 컴파일러가 C ++ 11과 호환되는지 여부를 확인할 수 있습니다.

이제 컴파일러가 C ++ 11 기능의 하위 집합을 지원하는지 확인하는 표준 방법을 찾고 있다면 표준 이식 방법이 없다고 생각합니다. 자세한 정보를 얻으려면 컴파일러 문서 또는 표준 라이브러리 헤더 파일을 확인할 수 있습니다.


답변

나는 이것이 매우 오래된 질문이라는 것을 알고 있지만이 질문은 자주 볼 수 있으며 답변은 약간 구식입니다.

C ++ 14 표준을 사용하는 최신 컴파일러에는 C ++ 11 기능을 포함하여 기능을 확인하는 표준 방법이 있습니다. 포괄적 인 페이지는 https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations에 있습니다.

요약하면 각 기능에는에서 확인할 수있는 정의 된 표준 매크로가 있습니다 #ifdef. 예를 들어 사용자 정의 리터럴을 확인하려면 다음을 사용할 수 있습니다.

#ifdef __cpp_user_defined_literals


답변

확인 지원 C ++ 14 및 기타. GCC 5.2.1에서 테스트.

#include <iostream>

int main(){
        #if __cplusplus==201402L
        std::cout << "C++14" << std::endl;
        #elif __cplusplus==201103L
        std::cout << "C++11" << std::endl;
        #else
        std::cout << "C++" << std::endl;
        #endif

        return 0;
}


답변

이것을 사용할 수 있습니다 :

#if __cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1900)
    cout << "C++11 is supported";
#else
    cout << "C++11 is not supported";
#endif

C ++ 11의 경우 Visual Studio를 제외한 대부분의 컴파일러는 __cplusplus매크로를에 설정 201103L하지만 모든 버전의 Visual Studio는 199711LC ++ 11 이전의 다른 컴파일러에 사용 된 값으로 매크로를 설정합니다 . 이 코드는 Visual Studio를 제외한 모든 컴파일러 의 _cplusplus매크로와 비교하고 201103L컴파일러가 Visual Studio 인 경우 Visual Studio의 버전이 C ++ 11을 완전히 지원하는 Visual Studio의 첫 번째 버전 인 2015 이후인지 확인합니다 (Visual Studio 2015, _MSC_VER매크로에는 값 있습니다. 이 답변1900 참조 ).


답변

Boost.Config를 사용하지 않고 C ++ 11을 지원하는 컴파일러를 테스트해야하는 경우 상수 값을 확인하면 __cplusplus됩니다. 그러나 컴파일러는 C ++ 11 표준의 인기있는 기능 대부분을 지원할 수 있지만 전체 사양을 지원하지는 않습니다. 아직 C ++ 11 사양을 100 % 준수하지 않는 특정 Visual Studio 컴파일러에 대한 지원을 활성화하려면 Visual Studio 2013에서 컴파일 할 수있는 다음 코드 조각을 사용합니다.

#if defined(_MSC_VER)
#   if _MSC_VER < 1800 
#       error This project needs atleast Visual Studio 2013
#   endif
#elif __cplusplus <= 199711L
#   error This project can only be compiled with a compiler that supports C++11
#endif

Visual Studio 용 컴파일러 버전의 전체 목록은 Visual Studio 2008을 사용하여 코드를 컴파일하고 있는지 감지하는 방법에서 제공됩니다.


답변

전통적인 Linux / Unix 세계에서 autoconf는 전통적으로 라이브러리 및 컴파일러 기능의 존재 여부를 테스트하고 필요에 따라 파일에서 사용하는 config.h에 버그를 배치하는 데 사용됩니다.