gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 17:37:51 24 4
gpt4 key购买 nike

我需要将 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,Boost.Config提供 BOOST_NO_CXX11_NULLPTR 宏。

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

  • 如果您使用的是 CMake,则可以使用 compiler feature detection (特别是 cxx_nullptr)有条件地定义一个宏。

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

关于c++ - 如何可靠地检测对 nullptr 的支持?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42401431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com