我如何检查C ++ 11的支持?

有没有办法在编译时检测编译器是否支持C ++ 11的某些特性? 例如,像这样的东西:

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

Boost.Config有大量的macros ,可以用来testing对特定C ++ 11function的支持。

有一个名为__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更改的标准C ++库。

因此,在另一个答案中提到的Boost定义仍然是找出是否存在支持C ++ 11线程和标准的其他特定部分的唯一理智方法。

正如C ++ 11标准(§16..8)所述:

编译C ++翻译单元时, __cplusplus的名称定义为值201103L

使用该macros的值,可以检查编译器是否符合C ++ 11。

现在,如果您正在寻找一种标准的方法来检查编译器是否支持C ++ 11function的任何子集,我认为没有标准的可移植的方法。 您可以检查编译器文档或std库头文件以获取更多信息。

我知道这是一个非常古老的问题,但这个问题可能经常被看到,答案有点过时了。

较新的C ++ 14标准编译器有一个标准的方法来检查特性,包括C ++ 11特性。 全面的页面在https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations

总之,每个function都有一个标准的macros定义,你可以用#ifdef来检查。 例如,要检查用户定义的文字,可以使用

 #ifdef __cpp_user_defined_literals 

我只写了一个小testing套件来检查特定编译器支持哪些C ++ 11function。 但是,这当然是一个“预编译时间”检查。

https://github.com/sloede/cxx11tests

对于支持C ++ 14和其他。 在GCC 5.2.1上testing

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

如果你不想使用Boost.Config并且需要testing支持C ++ 11的编译器,那么检查常量__cplusplus的值就可以了。 但是,编译器可能支持C ++ 11标准的大多数stream行function,但它不支持整个规范。 如果要启用对尚未100%符合C ++ 11规范的特定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 2008编译代码时如何检测 Visual Studio的编译器版本的完整列表

在传统的Linux / Unix世界中,autoconf传统上用于testing库和编译器function以及将它们放入您所需要的文件中使用的config.h中的错误。

你可以使用这个:

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

对于C ++ 11,一些编译器在__cplusplus设置__cplusplusmacros,其他设置为199711L 。 该解决scheme与这两种情况都兼容。