C语言中的NULL与C++11中的nullptr是否相等?

49

我喜欢使用nullptr代替NULL。现在我调用了一个C函数(这里是来自libjansson的)。

C中的NULL是实现定义的。

对于nullptr,我发现“null指针常量是整数类型(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
选择语言。语言会告诉你要使用什么。你不能混合搭配。 - Ed Heal
9
这是一道互通性问题。 - user877329
对于从C++调用的C函数,根据需要在参数中使用NULL。否则,请使用nullptr。如果从C++转换到C,请使用v == nullptr ? NULL : v,反之亦然。 - Ed Heal
3
为什么要这样做?在C++中,将指针赋值为nullptr与将其赋值为NULL(或甚至0)的效果是相同的:X* ptr = NULL;X* ptr=nullptr;X* ptr=0;在C++中都会执行同样的操作。同样地,ptr == NULLptr == nullptrptr==0!ptr在C++代码中保证返回相同的值。请问您需要翻译其他内容吗? - Yakk - Adam Nevraumont
我认为NULL不一定是零。只需要与零进行比较即可。因此nullptr可能不等于NULL。https://dev59.com/jWkw5IYBdhLWcg3wbqES - Ed Heal
显示剩余2条评论
1个回答

91
在C++11及以上版本中,一个等于NULL的指针也等于nullptr,反之亦然。
除了将其用于与指针比较(例如将其用于表示字符串末尾的空字节)之外,NULL的其他用途都不能与nullptr一起使用。
在某些情况下,NULL#define NULL 0,因为在C和C++中,当您将整数常量0与指针进行比较时,会针对这种特殊情况进行处理。这种非类型信息在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不同(除非传递给期望指针的参数,否则NULL0会变成int,而nullptr仍然是nullptr_t),并且在某些上下文中使用nullptr会导致编译错误(例如char c = NULL;)(注意,不是char* c=NULL;)。
最后,字面意思:
NULL == nullptr

是真的。

NULL常量被提升为指针类型,作为指针它是一个空指针,然后与nullptr相等。


尽管如此,这并不总是正确的:

 foo(NULL)

并且

 foo(nullptr)

做同样的事情。

void bar(int) { std::cout << "int\n"; }
void bar(void*) { std::cout << "void*\n"; }
template<class T>
void foo(T t) { bar(t); }
foo(NULL);
foo(nullptr);

这段代码会输出int作为NULL的值,void*作为nullptr的值


2
伟大而全面的答案 - Valen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接