>

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

#ifndef VARIADIC_TEMPLATES_SUPPORTED
#error "Your compiler doesn't support variadic templates.  :("
#else
template <typename... DatatypeList>
class Tuple
{
    // ...
}
#endif


  • 답변 # 1

    Boost.Config에는 특정 C ++ 11 기능에 대한 지원을 테스트하는 데 사용할 수있는 수많은 매크로가 있습니다.

  • 답변 # 2

    __cplusplus 라는 상수가 있습니다.  C ++ 컴파일러는 지원되는 C ++ 표준 버전으로 설정해야합니다.

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

    Visual Studio 2010 SP1에서 199711L로 설정되었지만 벤더가 (부분) 컴파일러 수준의 지원을 표준 C ++ 라이브러리와 비교했을 때 이미 대폭 증가시킬 것인지는 모르겠습니다. +11 변경 사항

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

  • 답변 # 3

    C ++ 11표준 (§iso.16.8) 기준 :

    와이즈 비즈

    이 매크로의 값으로 컴파일러가 C ++ 11과 호환되는지 확인할 수 있습니다.

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

  • 답변 # 4

    이 질문은 매우 오래된 질문이지만이 질문이 자주 표시 될 수 있으며 답변이 약간 오래된 것으로 알고 있습니다. .

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

    에 있습니다.

    요약하면, 각 기능에는

    The name__cplusplusis defined to the value201103Lwhen compiling a C++ translation unit.

    로 확인할 수있는 표준 매크로가 정의되어 있습니다 . 예를 들어 사용자 정의 리터럴을 확인하려면

    #ifdef
    
    

  • 답변 # 5

    C ++ 14 및 기타 지원을 확인하십시오. GCC 5.2.1에서 테스트.

    #ifdef __cpp_user_defined_literals
    
    
    #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; }

  • 이전 javascript - DOM 요소 내에서 텍스트 줄을 어떻게 셀 수 있습니까? 할 수 있습니까?
  • 다음 php - PHP5에서 인라인 문자열 사용과 연결 속도 차이?