是否有检测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_SUPPORTED
types的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
而不仅仅是编译器,版本或其他。
您可以检查__cplusplus
macros的值。 对于C ++ 11,它大于199711L
。
所以像
#if __cplusplus > 199711L #endif
Boost.Config库提供了可用于根据给定的C ++ 11function的存在条件编译的粒度预处理器macros 。
(对于编译器来说,C ++ 11的支持不一定是一个全部或者全无的命题,例如,考虑一下微软的Cherry如何根据他们认为最有利于他们的客户的方式,select在Visual Studio 2012中包含哪些C ++ 11function 。 )