当前位置: 首页 > wzjs >正文

分析网站建设外链代发

分析网站建设,外链代发,上海传媒公司李健,公司部门职位前言 发现还是有人不知道NULL 与nullptr的区别,故写此文章。 正文 对于NULL 先看NULL的源码 我们可以看出这段代码是一个典型的预处理器宏定义块,用于处理 NULL 宏的定义。 先看开头 #if defined (_STDDEF_H) || defined (__need_NULL)这行代码检…

前言

发现还是有人不知道NULLnullptr的区别,故写此文章。

正文

对于NULL

先看NULL的源码
在这里插入图片描述

我们可以看出这段代码是一个典型的预处理器宏定义块,用于处理 NULL 宏的定义。
先看开头

#if defined (_STDDEF_H) || defined (__need_NULL)
  • 这行代码检查是否已经定义了 _STDDEF_H__need_NULL
    • _STDDEF_H 通常是在包含标准库头文件 <stddef.h> 时定义的宏。
    • __need_NULL 是某些情况下(例如,部分标准头文件仅需要 NULL 定义)会定义的宏。

如果其中一个宏已定义,则代码块会执行。


#undef NULL		/* in case <stdio.h> has defined it. */
  • #undef NULL 取消之前可能在其他头文件(例如 <stdio.h>)中定义过的 NULL,确保后续的定义不会发生冲突。

#if defined(__GNUG__) && __GNUG__ >= 3
#define NULL __null
  • 这一部分是针对 GNU C++ 编译器(G++)版本 3 及以上的特定定义。
    • __GNUG__ 是 G++ 编译器的特定宏,用于检测当前编译器是否为 G++。
    • __null 是 G++ 3.x 及以上版本中的内部表示,用于专门处理空指针的情况。

如果符合条件(G++ 3.x 及以上版本),NULL 被定义为 __null


#else   /* G++ */
#ifndef __cplusplus
#define NULL ((void *)0)
  • 如果当前编译环境不是 G++ 3.x 或更新版本,且不是 C++,那么 NULL 被定义为 ((void *)0)
    • 在 C 语言中,NULL 通常定义为 (void *)0,表示一个空指针。

#else   /* C++ */
#ifndef _WIN64
#define NULL 0
  • 进入了 C++ 的条件分支。
    • 如果正在编译 C++ 代码,且不是 64 位 Windows 环境(未定义 _WIN64),则 NULL 定义为 0
    • 在 C++ 中,NULL 通常直接定义为 0,因为 C++ 允许整数 0 被隐式转换为指针类型。

#else
#define NULL 0LL
#endif  /* W64 */
#endif  /* C++ */
  • 如果是在 64 位 Windows 环境中,NULL 定义为 0LL,表示一个 64 位的长整数常量(long long)。
    • 在 64 位环境中,使用 0LL 以保证 NULL 的大小与指针的大小一致。

#endif  /* G++ */
#endif  /* NULL not defined and <stddef.h> or need NULL.  */
  • 关闭之前的条件编译语句。
  • #endif 对应前面的 #if,表示条件编译的结束。

#undef	__need_NULL
  • 这行代码取消定义 __need_NULL,确保之后不会再次使用这个宏。

总结

  • 在 GNU C++ 3.x 及以上版本中,NULL 定义为 __null
  • 在 C 语言中,NULL 定义为 (void *)0,表示空指针。
  • 在 C++ 中,NULL 定义为 0,因为 0 可以隐式转换为指针类型。
  • 在 64 位 Windows 环境下,为了确保指针和 NULL 的大小一致,定义为 0LL
  • 由以上我们可知NULL既可以表示0又可以表示(void*)0,这就说明它有二义性。

测试

int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);int* ptr = NULL;int b = 0;int* ptr2 = nullptr;QString* ptr3 = nullptr;if (ptr == 0) {qDebug()<<"ptr is null"<<ptr;}if (b == NULL) {qDebug()<<"b is null"<<b;}if (ptr2 == 0) {qDebug()<<"ptr2 is nullptr"<<ptr2;}if (!ptr3) {qDebug()<<"ptr3 is nullptr"<<ptr3;}return a.exec();
}
运行结果

在这里插入图片描述

对于nullptr

我并没有找到它的源码(如果有找到的兄弟麻烦评论区告知下呗),但是我知道nullptr是一种新的数据类型,就是专门用来表示的一种数据类型。在源码中我只看到它简略的说明
在这里插入图片描述
nullptr的出现就是为了解决NULL即表示0又表示(void*)0的二义性问题。

手写nullptr

const class nullptr_t
{
public:// 模板类型转换运算符,可以将 nullptr 转换为任意类型的指针template<class T>inline operator T*() const{return 0;  // 返回值为 0,表示空指针}// 模板类型转换运算符,可以将 nullptr 转换为任意类成员指针template<class C, class T>inline operator T C::*() const{return 0;  // 返回值为 0,表示空成员指针}private:// 重载地址取运算符(&),防止获取 nullptr 的地址void operator&() const;} nullptrSelf = {};

使用:

// widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
const class nullptr_t
{
public:// 模板类型转换运算符,可以将 nullptr 转换为任意类型的指针template<class T>inline operator T*() const{return 0;  // 返回值为 0,表示空指针}// 模板类型转换运算符,可以将 nullptr 转换为任意类成员指针template<class C, class T>inline operator T C::*() const{return 0;  // 返回值为 0,表示空成员指针}private:// 重载地址取运算符(&),防止获取 nullptr 的地址void operator&() const;} nullptrSelf = {};class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void test(int* a);private:void* memberPtr;
};
#endif // WIDGET_H// widget.cpp#include "widget.h"
#include "qdebug.h"Widget::Widget(QWidget *parent): QWidget(parent)
{memberPtr = nullptrSelf;qDebug()<<"memberPtr:"<<memberPtr;int* a = nullptrSelf;test(a);}Widget::~Widget()
{
}void Widget::test(int* a)
{if (a == nullptrSelf) {qDebug()<<"a is null "<<a;} else {qDebug()<<"a is not null "<<a;}
}

输出结果

在这里插入图片描述

小结

请指正


文章转载自:

http://asYqOJIB.rdkgw.cn
http://HXtT3Exh.rdkgw.cn
http://kvOKE3Ow.rdkgw.cn
http://gMyrYzyW.rdkgw.cn
http://CjijSRbO.rdkgw.cn
http://eP18BAhu.rdkgw.cn
http://a0aX63vO.rdkgw.cn
http://PFxl22oB.rdkgw.cn
http://9zLs4Nll.rdkgw.cn
http://Fn8JJVAi.rdkgw.cn
http://lUcTAFqB.rdkgw.cn
http://L2VZOyDo.rdkgw.cn
http://bozInTtA.rdkgw.cn
http://0Z6X9wTx.rdkgw.cn
http://07xBXaS2.rdkgw.cn
http://uipcg7Jp.rdkgw.cn
http://xoGQ71la.rdkgw.cn
http://YbmAgqe3.rdkgw.cn
http://3rde9IF2.rdkgw.cn
http://YoaXubPH.rdkgw.cn
http://AcvliKMP.rdkgw.cn
http://wX64CrCb.rdkgw.cn
http://XtbRsuuO.rdkgw.cn
http://DHCyU6kT.rdkgw.cn
http://CX4ll3lC.rdkgw.cn
http://kMsiN2Va.rdkgw.cn
http://m679DLgK.rdkgw.cn
http://PpknsA1K.rdkgw.cn
http://TaOsEEaY.rdkgw.cn
http://fdJ59vSm.rdkgw.cn
http://www.dtcms.com/wzjs/721218.html

相关文章:

  • 建设外贸英文网站四川重庆是哪个省
  • 网络科技官网逆冬黑帽seo培训
  • 网站项目简约 时尚 高端 网站建设
  • 网站建设宀金手指花总十五郑州网站开发
  • 杭州seo网站排名优化腾讯企点怎么用
  • 做网站推广被骗seo北京
  • 网站建设站点邯郸小学网站建设
  • 服务器迁移到另一台服务器关键词优化价格
  • 备案 网站名称wordpress图片无法居中
  • 淮南市潘集区信息建设网站如何加强网站建设和信息宣传
  • 模拟建筑4安卓优化大师旧版本下载
  • 做网站买空间多少钱wordpress 上一篇文章
  • 分阶段建设网站网站建设公司位置
  • 公司网站地址365建筑人才网
  • 网站后台登陆密码忘记了西亚网站建设科技
  • ip查询网站wordpress上传文件插件
  • 为什么网站需要备案湖南长沙招聘信息最新招聘2022
  • 淘宝网站建设方案模板西安制作网站公司哪家好
  • 杭州蚂蚁 做网站的公司广州正规网站建设公司
  • 网站架构原理用vue做网站
  • wap网站怎么发布官网建站平台
  • 石家庄网站建设公司黄页加强旅游网站建设
  • 销售 网站设计网站需要多少钱
  • 关于传媒的网站模板温州网站建设服务
  • 江西手机网站建设保山市城市建设网站
  • 注册域名之后如何做网站网站站开发 流量
  • 城乡建设部网官方网站建设网站基本流程
  • 如何建立自己的个人网站电商外贸平台大全
  • 工行网站跟建设网站区别外贸企业有哪些公司
  • 网站字体设计重要性做网站设计要注意什么问题