c语言中的NULL宏包含在在哪个头文件里

c语言中的NULL宏包含在在哪个头文件里,第1张

https://zh.cppreference.com/w/c/types/NULL

宏 NULL 是实现定义的空指针常量,可为

值为 0 的整数常量表达式

转型为 void* 的值为 0 的整数常量表达

空指针常量能转换为任何类型饥睁侍;转换结果是该类型的空指针值早知。

定义烂吵于头文件 <stddef.h>

定义于头文件 <string.h>

定义于头文件 <wchar.h>

定义于头文件 <time.h>

定义于头文件 <locale.h>

定义于头文件 <stdio.h>

定义于头文件 <stdlib.h>

#define NULL /*implementation-defined*/

朴素的0值或者无类型的0值(void 0)

计算机语言中为了确定数据宽度(占用字节数)以及数据编码,一般瞎带都是有类型定义的,比如C语言中bool为8位逻辑值(单字节),int 为16位整数(双字节),long 为32位整数(4字节),float是32位浮点数(4字节),double为64位浮点数(8字节),等等。

因此,数据类型定义了数据宽度和数据编码,因此严格意义上说,一个16位整数的0与一个32位整数的0,以及浮点数的0都是不同的,原因是数据宽度不同,特别是浮点数的0不是绝对戚神态的0值,它可能是一个0.0000000000000001很小的数,但是有时候我们需要一个明确的通用的或者一般意义的0值来表示无效值,比如为了表示指针未被赋预有效地址,我们设置一个0值,为了防止代码有歧义,也为了可读性(一看就知道表示未定义指针),所以C或者C++中都使用一个特殊定义NULL表示无效值,其本质就是未定义具体数据类型的0值。

由于没有定义数据类型,因此也就不具有具体数据宽度和编码,当NULL赋值给16位变量时就是16位全0,当赋值给32位变量时,其值就是32个全0,也不会出现像浮点数那样产生精度误差。这就是虚类型的意义,任何编译器都认可这种约定,这样代码移植的时候不会因为软硬件环境改变而出现问题(CPU、编译器改变)。

你可以在任何编译器中,点击NULL右键查看定义。

这里稍微解释一下,上图高亮部分是表示C++,也就是如果当前语言是C++,则直接定义NULL为 0值,如果是其他(可能是C),则明确定义为 void 0,因为C++编译器会自动转高源换。#ifndef 宏命令表示:如果当前环境中其他模块还未定义NULL,这就定义它。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/12262051.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存