内容简介:在C语言中,我们使用注:因为在C语言中,是允许C++语言出现后,为了保持对C语言的兼容,保留了
在 C语言 中,我们使用 NULL
表示空指针,它实际上是一个宏,具体被定义为,
/* C 语言程序 */ #define NULL ((void*)0) #define NULL 0 /* 两者皆可 */
注:因为在C语言中,是允许 void
指针隐式转换为其它类型指针的,所以 #define NULL ((void*)0)
这样的定义不会有问题。
C++语言出现后,为了保持对C语言的兼容,保留了 NULL
,但对 NULL
的定义变得更为严格,
/* C++ 语言程序 */
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void*)0)
#endif
NULL
被定义为0,而不是 ((void*)0)
,因为在C++语言中, void
指针是不可以隐式转换为其它类型指针的,必须显示转换,
/* C++ 语言程序 */ #define NULL ((void*)0) /* 如果在 C++ 语言中这么定义的话 */ int* a = NULL; /* 隐式转换,错误 */ int* a = (int*)NULL; /* 显示转换,正确,但很麻烦,所以 NULL 都会被定义为 0 */
在C++ 98之前(包括C++ 98),在对 NULL
的使用上,都一直存在一个问题,假设有下面的代码,
/* C++ 语言程序 */ void func(int i); void func(char* p); func(NULL); /* 该调用哪个?*/
NULL
其实就是等于0,对于上面的两个函数,它都是符合的,如此,就会出现语义二义性的错误。
为了解决上述重载函数所带来的问题,C++ 11的 nullptr
应运而生。 nullptr
实质上是一个常量,实现代码大致如下,
/* C++ 语言程序 */
const /* 常量 */
class
{
public:
template<class T>
operator T*() const /* 向任意类型的非成员指针转换 */
{
return 0;
}
template<class C, class T>
operator T C::*() const /* 向任意类型的成员指针转换 */
{
return 0;
}
private:
void operator&() const /* 不可取地址 */
{
}
} nullptr = {};
nullptr
只是一个常量,这就意味着我们可以在程序中随意定义一个与其名称相同的标识符,但因为 nullptr
在实际编程中的应用实在太广泛,因此C++编译器一般都会把 nullptr
定为关键字,避免 程序员 的滥用。
当然,C++ 11发布后,并没有因为 nullptr
的出现,而摒弃 NULL
,主要是为了兼容旧版程序。
最后,总结一下,
-
在C语言编程中,请使用
NULL。 此时的NULL,要么是((void*)0),要么是0,对于C语言而言,都无所谓。 -
在C++语言编程中,请使用
nullptr。 既为了避免以后出现bug,也为了养成一个良好的编程习惯。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Go Web 编程
[新加坡]Sau Sheong Chang(郑兆雄) / 黄健宏 / 人民邮电出版社 / 2017-11-22 / 79
《Go Web 编程》原名《Go Web Programming》,原书由新加坡开发者郑兆雄(Sau Sheong Chang)创作、 Manning 出版社出版,人名邮电出版社引进了该书的中文版权,并将其交由黄健宏进行翻译。 《Go Web 编程》一书围绕一个网络论坛 作为例子,教授读者如何使用请求处理器、多路复用器、模板引擎、存储系统等核心组件去构建一个 Go Web 应用,然后在该应用......一起来看看 《Go Web 编程》 这本书的介绍吧!