C NULL 是否等于 C++11 nullptr
Is C NULL equal to C++11 nullptr
我喜欢使用 nullptr
而不是 NULL。现在我调用一个 C 函数(在本例中来自 libjansson
)。
NULL
在 C 中是实现 defined.
对于 nullptr
我发现 "A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to zero".
所以最安全的做法是:
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;
在 C++11 及更高版本中,==NULL
的指针也将 ==nullptr
,反之亦然。
NULL
除了与指针比较(比如用它来表示字符串末尾的 nul 字节)之外的其他用法不适用于 nullptr
。
在某些情况下,NULL
是 #define NULL 0
,因为当您将整数常量 0
与指针进行比较时,它在 C 和 C++ 中是特殊情况。这种非类型类型信息会在 C 和 C++ 中引起一些问题,因此在 C++ 中,他们决定创建一个特殊的类型和值,在 "proper" 用例中做同样的事情,并且在大多数情况下可靠地编译失败"improper" 个用例。
只要您的 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
将其传递给推导类型的模板函数时会有所不同(NULL
或 0
变为 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);
我喜欢使用 nullptr
而不是 NULL。现在我调用一个 C 函数(在本例中来自 libjansson
)。
NULL
在 C 中是实现 defined.
对于 nullptr
我发现 "A null pointer constant is an integral constant expression (5.19) rvalue of integer type that evaluates to zero".
所以最安全的做法是:
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;
在 C++11 及更高版本中,==NULL
的指针也将 ==nullptr
,反之亦然。
NULL
除了与指针比较(比如用它来表示字符串末尾的 nul 字节)之外的其他用法不适用于 nullptr
。
在某些情况下,NULL
是 #define NULL 0
,因为当您将整数常量 0
与指针进行比较时,它在 C 和 C++ 中是特殊情况。这种非类型类型信息会在 C 和 C++ 中引起一些问题,因此在 C++ 中,他们决定创建一个特殊的类型和值,在 "proper" 用例中做同样的事情,并且在大多数情况下可靠地编译失败"improper" 个用例。
只要您的 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
将其传递给推导类型的模板函数时会有所不同(NULL
或 0
变为 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);