1 /*my_stddef.h*/ 2 /* 3 * 宏NULL。不指向程序声明或分配的任何数据对象的数据对象指针的值。0,0L,(void *)0(与函数指针不兼容)。 4 * 宏offsetof,肯定一个结构成员和这个结构的起始位置的偏移量(以字节为单位),展开为一个size_t类型的整值常量表达式,表驱动函数。 5 * ptrdiff_t:2个指针相减的结果的有符号整数类型。(2个指针不能相加,标准定义的)。不用,移植性很差。 6 * size_t:sizeof操做符的记过的无符号整数类型。很是有用。 7 * wchar_t:整值类型,它范围内的值能够表示最大扩展字符集中全部成员的不一样编码值。用不到。 8 */ 9 #ifndef MY_STDDEF_H_ 10 #define MY_STDDEF_H_ 11 12 #define MY_NULL (void *)0 13 typedef int my_ptrdiff_t; 14 typedef unsigned int my_size_t; 15 typedef unsigned short my_wchar_t; 16 #define offsetof(T, member) ((my_size_t)&((T*)0)->member) 17 #endif 18 /*把一个整数0强制转换为一个指针类型,而后对其结果执行指针算术,c标准未定义,但offsetof实现用了,因此编译器须要支持此*/
1 /*my_t_stddef.c*/ 2 #include <assert.h> 3 #include <limits.h> 4 #include <stdio.h> 5 #include "my_stddef.h" 6 7 typedef struct{ 8 char f1; 9 struct{ 10 float flt; 11 }f2; 12 int f3; 13 }Str; 14 15 static char *pc = NULL; 16 static double *pd = NULL; 17 static my_size_t offs[] = {offsetof(Str, f1), offsetof(Str, f2), offsetof(Str, f3)}; 18 19 int main(void) 20 { 21 my_ptrdiff_t pd = &pc[INT_MAX] - &pc[0]; 22 my_wchar_t wc = L'Z'; 23 Str x = {1, 2, 3}; 24 char *ps = (char *)&x; 25 26 assert(sizeof(my_ptrdiff_t) == sizeof(my_size_t)); 27 assert(sizeof(my_size_t) == sizeof(sizeof(int))); 28 assert(pd == &pc[INT_MAX] - &pc[0]); 29 assert(wc == L'Z'); 30 assert(offs[0] < offs[1]); 31 assert(offs[1] < offs[2]); 32 assert(*(char *)(ps + offs[0]) == 1); 33 assert(*(float *)(ps + offs[1]) == 2); 34 assert(*(int *)(ps + offs[2]) == 3); 35 printf("sizeof(size_t) = %u\n", sizeof(my_size_t)); 36 printf("sizeof(wchar_t) = %u\n", sizeof(my_wchar_t)); 37 puts("succes testing stddef.h"); 38 return 0; 39 }