热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++NULLvs__null

如何解决《C++NULLvs__null》经验,为你挑选了3个好方法。

我有以下代码:

MyType x = NULL;

NetBeans给了我一个改变它的建议:

MyType x = __null;

我查了一下,发现它__null被称为"编译器关键字",我认为这意味着它在内部用于编译器.我不明白为什么NetBeans建议将其更改为编译器关键字.

c ++ NULL__nullc ++ 之间的区别是什么?



1> ShadowRanger..:

__null是一个g++内部事物,其作用与nullptrC++ 11中添加的标准大致相同(始终作为指针,从不作为整数).

NULL被定义为0,可以隐式地用作整数,布尔值,浮点值或指针,当涉及到重载解析时,当你想要专门调用带有指针的函数时,这是一个问题.

无论如何,您不应该使用__null它,因为它是一个g++实现细节,因此使用它可以保证不可移植的代码.如果你可以依赖C++ 11(肯定你现在可以吗?),请使用nullptr.如果没有,NULL是您唯一的便携式选择.


注意,`NULL`不必定义为`0`.这是实现选择的空指针常量.
@DavidConrad - `(void*)0`是C中的有效空指针常量,但在C++中**不是**.
@PeteBecker我认为在这里作为指针的地址的'0`和源代码中的文字'0`之间存在一些混淆.后者被定义为在将其指定给指针时产生空指针,即使结果地址是实现定义的.

2> Stephan Lech..:

NULL 已经从C语言转换为C++语言 - 在C++ 11之前 - 采用了它的C语义:

直到C++ 11:宏NULL是一个实现定义的空指针常量,它可以是整数类型的整数常量表达式rvalue,其值为零.

然后,C++ 11引入了一个nullptr类型的专用空指针文字std::nullptr_t.但是 - 可能是为了向后兼容 - 宏NULL没有被删除; 它的定义有点放松,因为编译器现在可以将其定义为整数或指针类型:

C++ 11以上版本:值为零的整数文字,或类型为std :: nullptr_t的prvalue

如果使用NULL,则在重载决策中获得实现定义的行为.例如,考虑以下代码和使用NULL-macro 的整数版本的编译器.然后使用NULLas参数调用传递给函数可能会导致歧义:

struct SomeOverload {

    SomeOverload(int x) {
        cout <<"taking int param: " <

因此,建议nullptr您在想要表达指针类型的地方使用.

并且不要使用__null,因为这是一个特定于编译器的非可移植常量; nullptr相比之下,它非常便携.



3> Some program..:

NULL是空指针的旧C符号.C++传统上用于0空指针,并且自C++ 11标准以来nullptr.

考虑到它x似乎不是一个指针,那么你不能初始化x为空指针,并且该__null符号可能是一个空值的编译器内部符号(这是一个在标准C++中并不存在的概念) ).

如果要x初始化为某个默认状态,则必须依赖MyClass默认构造函数将对象及其成员变量初始化为某些合适的默认值.


推荐阅读
author-avatar
cherry
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有