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而不是某些布尔值。
- 请注意,在C ++中,由于更严格的隐式转换规则会使得这种
NULL
的使用变得繁琐(您必须每次都明确地将其转换为比较指针的类型),因此无法使用void *
cast。
好吧,NULL可能不是零,它通常是。 它取决于您的平台 – 这里有一些非零NULL机器的讨厌例子 。
NULL在指针中有广泛的意义。 很可能一个声明为NULL的指针是无法引用的东西,但只能分配一些东西。 而0或0x0可以是指针的值,可以引用和分配。
通常在C++
您不应该使用NULL
。 在C
, NULL
是(void*)0
的宏,而在C++
您应该使用0
而不是NULL
。 但你不能使用false
而不是0
来指针! 除此之外,它们实际上是相同的,有时会造成混乱。
这就是为什么在C++11
, nullptr
被定义为用于指针的原因。
在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
即使这篇文章声称它是NULL
, 0x0
和false
几乎是相同的。