【发布时间】:2017-07-13 02:08:26
【问题描述】:
我需要将 nullptr 反向移植到我们拥有的跨平台库,但我无法可靠地检查 nullptr 支持。
最初我有这个:
#if __cplusplus >= 201103L || (__cplusplus < 200000 && __cplusplus >= 199711L)
// nullptr should be ok
#else
// Too old
#endif
但后来我发现编译一个刚刚打印出 __cplusplus 值的程序会产生意想不到的结果。
一篇博文声称 199711L 是 MS 编译器用来表示对 C++11 的部分支持的值。但我注意到 g++ 5.4 默认生成该值。直到你明确告诉它使用 -std=c++11 编译。 但是,如果您告诉它标准是 c++98,则仍会显示值 199711。这对我来说听起来不对。所以这不是一个好的检查!
然后我看到someone doing this 的答案声称它可能有效。好吧,它没有。
#if !defined(nullptr)
#endif
但我不确定你能做到这一点。所以我这样测试它:
#if defined(nullptr)
#error "null ptr defined"
#endif
你猜怎么着?当 nullptr 实际可用时,它不会打印出错误。所以根本没有。
如何在 linux/windows 和 OSX (clang)/android 下检测 nullptr 或编译器版本。
【问题讨论】:
-
如果它不可用,使用它的代码将无法编译。对我来说,这似乎是一个非常简单的指标。为什么你认为你需要(或可以)“向后移植”它?
-
查看 Boost.Config 的
BOOST_NO_CXX11_NULLPTR宏。要么使用 Boost.Config,要么复制他们用来确定这一点的等效逻辑。 -
@Matt 您是否尝试过对 nullptr_t 进行类型特征检查? sth like std::is_same or sth like that.
-
典型的 XY 问题。只需使用
NULL,直到您不必支持旧版编译器。 -
@matt 最后的编辑应该是一个答案。