看C的历史,它并没有产生强制类型的指针。在C中,你可以很容易的给指针赋以数字值或者混合不同类型的指针。C++的创造者为了回避这个混乱的局面,因为它可能会在运行时造成一些让人难以理解的错误。因此,C++的指针是强制类型。
因此C和C++定义NULL是不同的。C++的编写者必须一定NULL好像0或0L。比如:
// C++ implementations usually define NULL this way
#define NULL 0
#define NULL 0L
对比C,C的编写者可以定义NULL为各种形式,包括一下这种:
// C compilers may define NULL this way
#define NULL ((void*)0)
在C++中,没有明白的造型,void*是不会隐讳的转换成为其他类型的指针。如果C++保留C的习惯,如C++的语句为:
char * p = NULL;
可以扩大为:
file://compile time error: incompatible pointer types
char * p = (void*) 0;
但是在C++中,void*的隐含模式允许为其他的数据指针。在优先表示NULL中,C++通常用0好过void类型的指针。事实上,C++鼓励用0代替NULL。例如:
int *p=0;
string *ps=new string;
delete ps;
ps=0; file://mark ps as deleted
尽管这两种NULL的表示方法的区别对于用户来说不是那么重要,但是在交叉式平台的开发中,这两种方法的区别是很重要的。