是否有检测C ++ 11x支持的预处理器指令?

如果有一些代码尽可能使用C ++ 11x扩展,但是如果不支持,则有一个回退。 目前OSX版本的GCC和VisualC编译器几乎不支持C ++ 11x,所以我使用:

#if (defined(__APPLE__) || (defined(_WIN32))) ...fallback code without C++11x ... #else ... code using C++11x ... #endif 

而这个工作,但不是真的是正确的事情,特别是因为在MacPorts的gcc编译器支持c + + 11x。

是否有#define C11X_SUPPORTEDtypes的macros? 也许只有GCC有?

__cplusplus应该在C ++ 11之前的编译器中定义为199711L在C ++ 11中定义为199711L 。 这在实践中是否有很大帮助是另外一个问题:大多数编译器只有一半,所以不应该将其定义为201103L ,即使它们支持您感兴趣的function。编译器的说谎并不是闻所未闻:例如,一个编译器将其定义为199711L ,不支持export模板。 但functiontesting没有标准function。

最简单的解决scheme就是不要使用任何特定的新function,除非您确定所有的编译器都支持它。 无论如何你必须编写和支持后备代码。 为什么保持两个版本。 这个规则的一个例外可能是影响性能的新特性:编译器是否支持移动语义。 在这种情况下,我会build议一个依赖于编译器的include文件,这个文件是基于编译器文档和个人testing编写的; 只是因为编译器可能logging它支持一个特定的function并不意味着它的支持是没有缺陷的。 只要为每个目标编译器创build一个目录,就把这个文件放在那里,并在你的makefile或project文件中指定相应的-I/I选项。

你的testing应该是这样的:

 #ifdef HAS_MOVE_SEMANTICS ... #endif 

而不仅仅是编译器,版本或其他。

您可以检查__cplusplusmacros的值。 对于C ++ 11,它大于199711L

所以像

 #if __cplusplus > 199711L #endif 

Boost.Config库提供了可用于根据给定的C ++ 11function的存在条件编译的粒度预处理器macros 。

(对于编译器来说,C ++ 11的支持不一定是一个全部或者全无的命题,例如,考虑一下微软的Cherry如何根据他们认为最有利于他们的客户的方式,select在Visual Studio 2012中包含哪些C ++ 11function 。 )