C NULL是否等于C++ 11 nullptr

use*_*329 17 c null interop c++11

我喜欢使用nullptr而不是NULL.现在我调用一个C函数(libjansson在本例中).

NULL在C中是实现定义的.

因为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;
Run Code Online (Sandbox Code Playgroud)

我真的需要它还是可以更简单地做到这一点:

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;
Run Code Online (Sandbox Code Playgroud)

Yak*_*ont 30

在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
Run Code Online (Sandbox Code Playgroud)

如下:

ptr = nullptr
ptr = NULL
ptr = 0
Run Code Online (Sandbox Code Playgroud)

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

X* ptr = nullptr;
X* ptr = NULL;
X* ptr = 0;
Run Code Online (Sandbox Code Playgroud)

nullptr不同的,当你把它传递给演绎类型的模板函数(NULL0成为int除非传递给一个说法预期的指针,而nullptr仍然是一个nullptr_t),并在某些情况下使用时,其中nullptr不会编译(像char c = NULL;)(注意,不是char* c=NULL;)

  • 伟大而广泛的答案 (2认同)