stddef.h

来源:互联网 发布:社招 算法题 编辑:程序博客网 时间:2024/05/22 03:34

头文件stddef.h(standard define标准定义)。独立环境——由于种种原因而不能支持完整的C标准库的环境。独立环境程序使用的所有其他类型或者宏定义(除了float.h、limits.h、stdarg.h)都只能由头文件stddef.h提供。

#ifndef MY_STDDEF_H    #define MY_STDDEF_H    #ifndef MY_YVALS_H        #include "my_yvals.h"    #endif // MY_YVALS_H    #define NULL _NULL    #define offsetof(T, member) ((_Sizet)&((T *)0)->member)/*注意这里的两个强制转换*/    #ifndef _SIZET        #define _SIZET        typedef _Sizet size_t;    #endif // _SIZET    #ifndef _WCHART        #define _WCHART        typedef _Wchart wchar_t;    #endif // _WCHART    typedef _Ptrdifft ptrdiff_t;#endif

一个简单版本的stddef.h头文件。定义有ptrdiff_t、size_t、wchar_t、NULL和offsetof。ptrdiff_t表示两个指针相减的结果的有符号整数类型。size_t是sizeof操作符的结果的无符号整数类型。wchar_t是一个整数类型,其范围内的值可以表示最大扩展字符集中所有成员的不同编码值。NULL,展开为现实定义的空指针常量。offsetof确定一个结构成员和这个结构的起始位置的偏移量(单位是字节)。宏offsetof(offsetof(type, member-designator))展开为一个size_t类型的无符号整数类型常量表达式,它的值是从结构的起始位置(由type指定)到结构成员(由member-designator指定)的偏移量,以字节为单位。注意member-disignator应该满足static type t;表达式&((T *)0)->member计算一个地址常量。然后强制转换为(_Size)类型。
注意类型ptrdiff_t;在一个C表达式中对两个指针相减时,结果的类型就是ptrdiff_t。ptrdiff_t是一个可以表示负值的整数类型,那么不是int就是long类型。并且一般而言,ptrdiff_t和无符号类型size_t的位数相同。也就是说,如果size_t是unsigned long,那么ptrdiff_t就是long。注意哟,只有当两个指针具有可兼容的数据对象类型时,才能对其进行相减。其实,指针的运算一般都在同一个数组数据对象中进行,不然指针运算并没有任何意义的结果。指针相减的步骤是,程序将两个指针都表示为对公共地址空间中的某一个点的偏移量(单位是字节);然后将偏移量相减,得到一个有符号的中间结果:接着让该中间结果除以指针指向的数据对象的大小(单位是字节)。
注意size_t类型;在一个C表达式中使用sizeof运算符的时候,结果的类型就是size_t。size_t是一个无符号整数类型,是unsigned int或者unsigned long类型。size_t是表示用作数组下表的任意整数数据对象的最安全的类型。但是要注意,size_t用作计数器的话,永远都不会递减到一个负数。
wchar_t(一个整数类型)表示实现支持的所有款字节字符编码的所有编码值。
宏NULL;可以是定义0、0L或者(void )0中的任意一个。《C标准库》上说的是“(void )0和所有的数据对象指针兼容,但是和函数指针不兼容”。看如下代码:int (*pfun)(void) = NULL;,但是在我用的机器上的编译器编写这样的代码并没有警告,也许是规则改变了把(毕竟这是20多年前的书),也许是编译器做了优化。在标准C语言中,完全可以方便地把指向void的指针作为一般的数据对象指针类型使用,特别是声明函数参数和返回值的时候。一种编写风格是完全避免NULL。使用一个合适的强制转换来编写每一个空指针常量。比如(int *)0。

0 0