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