首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现安全nullptr

实现安全nullptr
EN

Stack Overflow用户
提问于 2012-12-03 07:36:39
回答 3查看 1.9K关注 0票数 6

我想让我的代码在传统C++ (使用“NULL”的C++代码)和新的C++11标准(使用“nullptr”的C++代码)上都是可编译的。

我使用的是GCC,但我计划在完成最重要的事情时,也为VS重新编译整个代码库。

我应该期望GCC和VS都会这样做吗?

代码语言:javascript
复制
#define NULL nullptr

或者我自己来做更好(当然使用一个不同的名称,其中MY_LIB将被我的库后缀取代)?

代码语言:javascript
复制
#ifndef nullptr
    #define MY_LIB_NULL NULL
#else
    #define MY_LIB_NULL nullptr
#endif

我想要实现的是无论是否实现了C++11特性都可以编译的代码(因为我没有使用模板,所以它们很少)。

例如,关键字"override“和"final”已经完成。

代码语言:javascript
复制
MY_LIB_OVERRIDE //macro, defines to "override" if c++11 is present.
MY_LIB_FINAL    //macro, defines to "final" if c++11 is present.

我之所以问这个问题,是因为我知道"nullptr“这个问题有点奇怪,所以可能只做我对override和final做过的同样的事情是错误的。需要关于这方面的意见。任何帮助都是wellcome。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-03 23:26:38

您可以通过以下方式创建my_nullptr_t类型的"false“my_nullptr

代码语言:javascript
复制
const class my_nullptr_t
{
    public:

        /* Return 0 for any class pointer */
        template<typename T>
        operator T*() const
        {
            return 0;
        }

        /* Return 0 for any member pointer */
        template<typename T, typename U>
        operator T U::*() const
        {
            return 0;
        }

        /* Safe boolean conversion */
        operator void*() const
        {
            return 0;
        }

    private:

        /* Not allowed to get the address */
        void operator&() const;

} my_nullptr = {};

这适用于C++03和C++11,并且无论实现哪种C++11功能,都应该始终是安全的。这个解决方案实际上已经在this topic中讨论过了,它提出了一个基于the Official proposalnullptr_t版本。

票数 4
EN

Stack Overflow用户

发布于 2012-12-03 22:23:33

NULL是一个扩展为空指针常量的宏。它仍然像以前一样工作。必须使用非C++11编译器的代码应该使用NULL

票数 1
EN

Stack Overflow用户

发布于 2012-12-03 16:44:56

我认为下面的will是可行的:

代码语言:javascript
复制
#include <cstddef>

#ifndef MY_LIB_NULL
    #ifndef NULL //check for NULL
        #define MY_LIB_NULL nullptr
    #else
        #define MY_LIB_NULL NULL ///use NULL if present
    #endif
#endif

基本上,我检查"NULL“。当编译器只提供" nullptr“并且不再使用nullptr时,它是有效的,然后使用nullptr(也许在很远的将来,但似乎我们可以很高兴地继续使用NULL!)

我认为这比重新定义"nullptr“更安全(就像大多数人试图做的那样)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13675203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档