C和C ++中的NULL / false超过0x0 / 0b0 /’\ 0’/ 0

正如问题所述,我一直在使用NULL和false(在C ++中)与0或0x0交替使用,依此类推。 我很想知道除了是0的同义词之外他们是否有任何特殊意义。

对于某些平台, NULL不是0x0


从C中的NULL是否需要/定义为零? :

NULL保证为零,可能已转换为(void *) 1

C99,§6.3.2.3,¶3

值为0的整型常量表达式或类型为void *的表达式称为空指针常量。(55)如果将空指针常量转换为指针类型,则生成的指针称为空指针,保证比较不等于指向任何对象或函数的指针。

注55说:

55)宏NULL在 (和其他头文件)中定义为空指针常量。

请注意,由于如何制定空指针的规则,用于分配/比较空指针的值保证为零,但实际存储在指针内的位模式可以是任何其他东西(但AFAIK只有少数非常深奥的平台利用了这个事实,这不应该是一个问题,因为要“看到”你应该进入UB -land的基础位模式无论如何)。


因此,就标准而言,这两种forms是等价的( !ptr等于ptr==0因为§6.5.3.3¶5,而ptr==0等价于ptr==NULL ); if(!ptr)也是非常惯用的。

话虽这么说,我通常明确地写if(ptr==NULL)而不是if(!ptr)以使我更清楚我正在检查指针是否为null而不是某些布尔值。


  1. 请注意,在C ++中,由于更严格的隐式转换规则会使得这种NULL的使用变得繁琐(您必须每次都明确地将其转换为比较指针的类型),因此无法使用void * cast。

好吧,NULL可能不是零,它通常是。 它取决于您的平台 – 这里有一些非零NULL机器的讨厌例子 。

NULL在指针中有广泛的意义。 很可能一个声明为NULL的指针是无法引用的东西,但只能分配一些东西。 而0或0x0可以是指针的值,可以引用和分配。

通常在C++您不应该使用NULL 。 在CNULL(void*)0的宏,而在C++您应该使用0而不是NULL 。 但你不能使用false而不是0来指针! 除此之外,它们实际上是相同的,有时会造成混乱。
这就是为什么在C++11nullptr被定义为用于指针的原因。

在C和历史C ++中, NULL必须是零值整数常量,通常为0 。 我认为C可以包含对void*的显式转换,但是C ++不能,因为该语言不允许从void*到其他指针类型的隐式转换。

在现代C ++中,它可以是nullptr

在任何一种情况下,任何零值整数常量(包括诸如'\0'false )都可以转换为空指针值。

来自linux内核stddef.h

 #define NULL ((void *)0) enum { false = 0, true = 1 }; 

所以这并非完全false

即使这篇文章声称它是NULL0x0false几乎是相同的。