C NULL是否等于C ++ 11 nullptr

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

C中的NULL是实现定义的 。

对于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; 

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

除了与指针比较之外的NULL使用(比如使用它来表示字符串末尾的nul字节)将不适用于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; 

NULL传递给一个推导类型的模板函数( NULL0成为一个int除非传递给一个期望指针的参数,而nullptr仍然是一个nullptr_t ),并且在一些上下文中使用nullptr将无法编译时(例如nullptr char c = NULL; )(注意,不是char* c=NULL;