stddef.h
这个头文件里变包含的就是C 的标准定义。C标准委员会认为即使再一个独立的环境中,C语言也应当有它的用途,独立环境是一个由于种种原因而不能支持完整C标准库的环境。对于这样的实现只需要实现4个C语言的头文件就可以了,分别是:<float.h> <limits.h> <stdarg.h> <stddef.h>.它也可以支持更多,但是C 标准没有对中间级别进行说明。
在一些环境中,实现必须提供整个的C标准库,这种环境就叫宿主环境,它是指代完全实现C标准的环境的正式术语。
<float.h> 描述了浮点数标示的属性
<limits.h> 描述了整数标示的属性
<stdarg.h> 提供了遍历可变参数表时需要的宏
<stddef.h> 独立环境程序使用的所有其他类型或者宏定义都只能由一个头文件提供
<stddef.h> 的内容
类型:
ptrdiff_t 两个指针相减的结果是有符号整数类型
size_t 是sizeof 的结果类型,无符号整数类型
wchar_t 一个整值类型,它的范围内的值可以表示为最大扩展字符集中所有成员的不同编码值,而该字符集是由支持它的区域设置指定的。
宏:
NULL 这个宏后边说,其实它到底是0 ,0L, void * 0 是根据不同情况来定的
offsetof (type, member-designator) :
展开为一个size_t 类型的整值常量表达式,它的值是从结构体的起始位置(由type 指定)到结构体成员(由member-designator 指定)的偏移量,以字节为单位。member-designator 应该满足:
static type t :然后表达式&(t, member-designator)就会计算一个地址常量。
在linux 下他是这样做的:
#define offsetof(TYPE, MEMBER) ((size_t ) & ((TYPE *) 0)->MEMBER)
没什么,就是计算偏移量。
<stddef.h>的使用
ptrdiff_t 再一个C表达式中对两个指针相减结果类型就是ptrdiff_t 的。它是一个可以表示负值的整数类型。只有当两个指针具有可兼容的数据对象类型时,才能对它们进行相减。注意编译器会检查类型,像const 限制符都会检查。这个类型其实就是long int
计算方法:
1.把两个指针都表示对公共地址空间的某一个节点的偏移量
2.将这两个偏移量相减,得到一个有符号的中间结果
3.让中间结果除以这两个指针指向的元素对象大小(以字节为单位)
size_t 在一个C表达式中,sizeof 运算符的结果类型就是 size_t .一个无符号整形,但是现在linux 环境下已经将这个大小提升到了无符号长整形大小。
这个类型相比上一个类型要安全的多,用它来做数组下标你永远不需要担心安全的问题。
wchar_t 一个宽字节字符的字符串常量。它可以表示实现支持的所有宽字节字符编码的所有编码值。对于一个只对宽字节字符提供最小支持的实现来说,它可能和char 一样小,也可能和unsigned long 一样大。
NULL 这个宏可能定义为0,0L, (void *)(0) .
注意最后一种定义方式可以和任意的指针类型兼容,但是不能与函数指针兼容。
查看原文:http://zmrlinux.com/2015/11/21/%e6%8e%a2%e7%a7%98c-stddef-h/