C NULL是否等于C ++ 11 nullptr

时间:2016-04-07 18:34:17

标签: c c++11 null interop

我喜欢使用nullptr而不是NULL。现在我调用一个C函数(在这种情况下来自libjansson)。

C中的

NULL是实现defined

对于nullptr,我发现“空指针常量是一个整数类型的整数常量表达式(5.19)rvalue,其值为零”。

这是最安全的事情:

auto string_obj=json_object_get(m_handle,name);
if(string_obj!=NULL)
    {
    auto string=json_string_value(string_obj);
    if(string!=NULL)
        {return string;}
    }
return nullptr;

我真的需要那个,还是我可以更简单地做到:

auto string_obj=json_object_get(m_handle,name);
if(string_obj!=nullptr)
    {
    return json_string_value(string_obj); //Assume there is no difference between C NULL and C++11 nullptr
    }
return nullptr;

1 个答案:

答案 0 :(得分:24)

在C ++ 11及更高版本中,==NULL的指针也将==nullptr,反之亦然。

使用NULL而不是与指针比较(比如使用它来表示字符串末尾的空字节)不能使用nullptr

在某些情况下,NULL#define NULL 0,因为当您将其与指针进行比较时,整数常量0在C和C ++中是特殊的。这种非类型信息在C和C ++中都会引起一些问题,因此在C ++中,他们决定创建一个特殊的类型和值,在"适当的"用例,并且在大多数"不正确的"中可靠地无法编译。用例。

只要您的C ++实现与您正在使用的C实现兼容(非常罕见,这不是真的),一切都应该有效。

非常清楚,如果ptr是任何类型的指针,则以下表达式在C ++中是等效的:

ptr == nullptr
ptr == NULL
ptr == 0
!ptr

以下是:

ptr = nullptr
ptr = NULL
ptr = 0

如果X是某种类型,则以下语句也是如此:

X* ptr = nullptr;
X* ptr = NULL;
X* ptr = 0;

nullptr传递给模板函数时会有所不同,该函数会推断类型(NULL0成为int,除非传递给期望指针的参数,而{ {1}}仍然是nullptr),并且在nullptr_t无法编译的某些上下文中使用(例如nullptr)(注意,不是char c = NULL;)< / p>