如何可靠地检测对nullptr的支持?

Mat*_*att 8 c++ c++11

我需要将nullptr backport到我们拥有的跨平台库,但是我无法获得对nullptr支持的可靠检查.

最初我有这个:

#if __cplusplus >= 201103L || (__cplusplus < 200000 && __cplusplus >= 199711L)
    // nullptr should be ok
#else
    // Too old
#endif
Run Code Online (Sandbox Code Playgroud)

但后来我发现编译一个刚刚打印出__cplusplus值的程序会产生意想不到的结果.

一篇博客文章声称199711L是MS编译器用来表示对C++ 11的部分支持的值.但我注意到g ++ 5.4默认生成该值.直到你明确告诉它使用-std = c ++ 11编译.但是如果你告诉它标准是c ++ 98,那么仍然会显示199711的值.这对我来说听起来不对.所以这不是一个好检查!

然后我看到有人这样做的答案声称它可能有效.嗯,它没有.

#if !defined(nullptr)
#endif
Run Code Online (Sandbox Code Playgroud)

但我不确定你能做到这一点.所以我测试了这样:

#if defined(nullptr)
#error "null ptr defined"
#endif
Run Code Online (Sandbox Code Playgroud)

你猜怎么着?当nullptr实际可用时,它不会打印出错误.所以这根本不存在.

如何在linux/windows和OSX(clang)/ android下检测nullptr或编译器版本.

eml*_*lai 8

  • 如果您正在使用Boost,Boost.Config会提供BOOST_NO_CXX11_NULLPTR宏.

    Boost通过为每个不支持它的编译器版本组合定义它来实现这一点,因此您无法轻松复制该功能.

  • 如果您正在使用CMake,则可以使用编译器功能检测(特定cxx_nullptr)来有条件地定义宏.

#if !defined(nullptr)不起作用因为nullptr不是宏.