为什么在C ++中使用/是NULL?

时间:2014-04-08 09:03:53

标签: c++

C ++标准将空指针定义为0。在很多代码中,我已经看到了NULL宏。

为什么会这样?如果标准将NULL定义为0,为什么要使用特殊常量?

它只是一种美学选择,还是有更实际的理由?或者,过去有没有理由不再有效,即旧版C ++标准草案的延期?

开始使用NULL代替0的方式和原因是什么?

4 个答案:

答案 0 :(得分:4)

这是C的遗留物,其中NULL通常定义为(void*)0。在C中,由于转换规则,它使NULL可以隐式转换为任何其他指针类型,同时保持不可转换为整数类型:

int* a = NULL; /* OK */
int b = NULL;  /* ERROR */
然而,

C ++没有这种松散的类型转换,因此NULL在C ++中被定义为0。虽然这意味着int b = NULL;是合法的,但编译器通常足够聪明,如果你这样做就会发出警告,因为他们认识到NULL是一个特殊的宏,从而保留了一些类型的安全性......当警告有效。

当然,在C ++ 11中,应该使用nullptr代替。在C ++ 03中,即使Stroustrup已经建议使用0而不是宏。

答案 1 :(得分:2)

NULL0更具描述性,它们具有不同的基本含义。 0是整数,而NULL表示“无价值”或“无所事事”。同样,PI在您的代码中比3.1415926535897更具描述性。

这是一个妥协,直到C ++ 11,你应该使用nullptr关键字。现在,除了增加清晰度之外,您还可以获得实际的编译器支持。例如int x = NULL;并没有多大意义,因为即使NULL归结为整数,其意义也不是整数。 int x = nullptr;会出错。

答案 2 :(得分:1)

指针不是整数 - 它们的类型不同。所以int* p = 0;看起来不对,特别是在int* p = 5;是编译错误的情况下。

人们正在使用NULLreference)为空指针常量指定一个特殊字,即指示一个指向任何内容的指针。但是NULL只是一种解决方法,通常被认为是一个宏,它在C ++中(通常)解析为整数0

C ++ 11引入了nullptrreference)来一劳永逸地解决这个问题。

答案 3 :(得分:1)

我想说这只是C程序员的影响,其中NULL被用作初始化指针的标准值。