C ++标准将空指针定义为0
。在很多代码中,我已经看到了NULL
宏。
为什么会这样?如果标准将NULL
定义为0
,为什么要使用特殊常量?
它只是一种美学选择,还是有更实际的理由?或者,过去有没有理由不再有效,即旧版C ++标准草案的延期?
开始使用NULL
代替0
的方式和原因是什么?
答案 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)
NULL
比0
更具描述性,它们具有不同的基本含义。 0
是整数,而NULL
表示“无价值”或“无所事事”。同样,PI
在您的代码中比3.1415926535897
更具描述性。
这是一个妥协,直到C ++ 11,你应该使用nullptr
关键字。现在,除了增加清晰度之外,您还可以获得实际的编译器支持。例如int x = NULL;
并没有多大意义,因为即使NULL
归结为整数,其意义也不是整数。 int x = nullptr;
会出错。
答案 2 :(得分:1)
指针不是整数 - 它们的类型不同。所以int* p = 0;
看起来不对,特别是在int* p = 5;
是编译错误的情况下。
人们正在使用NULL
(reference)为空指针常量指定一个特殊字,即指示一个指向任何内容的指针。但是NULL
只是一种解决方法,通常被认为是一个宏,它在C ++中(通常)解析为整数0
。
C ++ 11引入了nullptr
(reference)来一劳永逸地解决这个问题。
答案 3 :(得分:1)
我想说这只是C程序员的影响,其中NULL被用作初始化指针的标准值。