c 标准库源码解剖

上传人:xzh****18 文档编号:45687873 上传时间:2018-06-18 格式:PDF 页数:185 大小:1.16MB
返回 下载 相关 举报
c 标准库源码解剖_第1页
第1页 / 共185页
c 标准库源码解剖_第2页
第2页 / 共185页
c 标准库源码解剖_第3页
第3页 / 共185页
c 标准库源码解剖_第4页
第4页 / 共185页
c 标准库源码解剖_第5页
第5页 / 共185页
点击查看更多>>
资源描述

《c 标准库源码解剖》由会员分享,可在线阅读,更多相关《c 标准库源码解剖(185页珍藏版)》请在金锄头文库上搜索。

1、C C C C 标准库源码解剖标准库源码解剖(01)(01)(01)(01):类型相关的定义:类型相关的定义说明:整个 C 标准库解剖系列环境为 Ubuntu 8.04,编译器为 gcc 4.2.4,由于 linux 系统中只有 C 标准库的头文件(在/usr/include 下),函数库被编译成了程序库,没有源代码,因此对源代码的解剖用的是 glibc 2.9,可从 GNU 的官方站点上下载。类型相关定义包括 limits.h、float.h、stddef.h、stdbool.h、stdarg.h、iso646.h、stdint.h 共 7 个头文件。除了 stdint.h 外,其余 6 个

2、文件在 gcc 编译器的/usr/lib/gcc/i486-linux-gnu/4.2.4/include 目录下。stdint.h 在/usr/include 中,是 C99 中引入的,提供了扩展整数的基本定义,放到后面再解剖吧。1 1 1 1、limits.hlimits.hlimits.hlimits.h: 定义了整数类型的范围。/usr/include 下也有 limits.h,它会自己先定义各个整数类型范围,这样当不用 gcc 来构建你的程序时就可以使用这些值。如果使用 gcc 编译器来构建你的程序,则会使用 gcc编译器自己的 limits.h(前面的定义都会#undef 掉)。由

3、于这个 limits.h 会用到 gcc 内置的 limits.h,因此我们解剖/usr/include 下的 limits.h。1./* ISO C99 Standard: 7.10/5.2.4.2.1整数类型的大小 */2.#ifndef _LIBC_LIMITS_H_3.#define _LIBC_LIMITS_H_ 14.#include /* 选项的宏,如 ISOC99 选项、POSIX 选项、XOPEN 选项等 */5.#define MB_LEN_MAX16/* 支持区域设置的多字节字符宽度为 16 位 */6./* 不使用 GNU CC 时就必须定义下面所有符号,否则使用 gc

4、c 编译器中的定义(看下面) */7.#if !defined _GNUC_ | _GNUC_ /* 定义了表示字的位数的_WORDSIZE 宏,64 位平台上值为 64,32 位平台上值为32 */11. #define CHAR_BIT8 /* char 类型的宽度为 8 位 */12. #define SCHAR_MIN (-128)/* signed char 的最小值为-27,补码表示为 10000000,没有对应的正数,其反数还是自己 */13. #define SCHAR_MAX 127/* signed char 的最大值为 27-1=01111111 */14. #defin

5、e UCHAR_MAX 255/* unsigend char 的最大值为 28-1=11111111(最小值为 0) */15. #ifdef _CHAR_UNSIGNED_/* 根据预定义宏来确定是让 char=unsigned char 还是char=signed char */16. #define CHAR_MIN 017. #define CHAR_MAX UCHAR_MAX18. #else19. #define CHAR_MIN SCHAR_MIN/* gcc 中使用了这个,即 char=signed char */20. #define CHAR_MAX SCHAR_MAX2

6、1. #endif22. #define SHRT_MIN(-32768) /* signed short int 的最小值为-215 */23. #define SHRT_MAX32767/* signed short int 的最小值为 215-1 */24. #define USHRT_MAX 65535/* unsigned short int 的最大值为 216-1(最小值为 0) */25. #define INT_MIN(-INT_MAX - 1) /* int 的最小值为-231 */26. #define INT_MAX2147483647/* int 的最大值为 231-1

7、 */27. #define UINT_MAX4294967295U/* unsigned int 的最大值为 232-1(最小值为 0) */28. #if _WORDSIZE = 64/* 64 位的 x86 平台,这个宏在中 */29. #define LONG_MAX 9223372036854775807L/* signed long int 最大值为 263-1 */30. #else/* 32 位的 x86 平台 */31. #define LONG_MAX 2147483647L/* signed long int 最大值为 231-1 */32. #endif33. #def

8、ine LONG_MIN(-LONG_MAX - 1L)/* signed long int 最小值为-231 */34. #if _WORDSIZE = 6435. #define ULONG_MAX18446744073709551615UL /* 64 平台: unsigend long int 最大值为 264-1 */36. #else37. #define ULONG_MAX4294967295UL /* 32 位平台:unsigned long int 最大值为 232-1 */38. #endif39. #ifdef _USE_ISOC99/* 中宏:long long 类型为

9、 C99 标准引入的 */40. #define LLONG_MAX9223372036854775807LL/* signed long long int 最大值为 263-1 */41. #define LLONG_MIN(-LLONG_MAX - 1LL)/* signed long long int 最小值为-263 */42. #define ULLONG_MAX18446744073709551615ULL /* unsigned long long int 最大值为 264-1 */43. #endif /* ISO C99 */44. # endif /* limits.h*/

10、45. #endif/* GCC 2.*/46. #endif/* !_LIBC_LIMITS_H_ */47. /* 获取编译器的 limits.h,其中定义几乎所有的 ISO 常量 */48. #if defined _GNUC_ /* 定义带符号整数类型 ptrdiff_t,这里_PTRDIFF_TYPE_3.依赖于平台,通常为 long 类型 */4.#if !(defined (_GNUG_) /* 定义无符号整型 size_t,_SIZE_TYPE_6.依赖于平台, 通常为unsigned int或unsigned long类型 */7.#ifdef _BEOS_8.typedef

11、typedeftypedeftypedef longlonglonglong ssize_t;/* 只用于 BeOS 系统中 */9.#endif10. #endif11. typedeftypedeftypedeftypedef _BSD_RUNE_T_ rune_t; /* 只用于老的 BSD 系统 */12. #ifndef _RUNE_T_DECLARED13. typedeftypedeftypedeftypedef _rune_t rune_t;/* 只用于 FreeBSD 系统中 */14. #define _RUNE_T_DECLARED15. #endif16. #ifnde

12、f _WCHAR_TYPE_17. #define _WCHAR_TYPE_ int18. #endif19. #ifndef _cplusplus/* C 中才要定义 wchar_t,C+中 wchar_t 为内置类型 */20. typedeftypedeftypedeftypedef _WCHAR_TYPE_ wchar_twchar_twchar_twchar_t; /* 宽字符类型 wchar_t 也在 stddef.h 中定义,这里为 int 类型 */21. #endif22. #ifndef _WINT_TYPE_23. #define _WINT_TYPE_ unsigned

13、 int24. #endif25. typedeftypedeftypedeftypedef _WINT_TYPE_ wint_twint_twint_twint_t;/* 用于无符号的宽字符类型中 */26. #ifndef _cplusplus27. #define NULL (void *)0)/* C 中定义 NULL 指针常量为(void*)0 */28. #else29. #define NULL 0/* C+中定义 NULL 指针常量为 0 */30. #endif31. #ifdef _STDDEF_H32. /* 结构成员的地址偏移字节数,TYPE 结构类型,MEMBER 为

14、其某个成员 */33. #define offsetof(TYPE, MEMBER) _builtin_offsetof (TYPE, MEMBER)34. #endifptrdiff_t 是两个指针相减所得的带符号整型,一般用 long 类型表示。size_t 是 sizeof 运算得到的无符号整型,一般用 unsigned int 或 unsigned long 表示。宽字符类型 wchar_t 也在 stddef.h 中定义,这里为 int 类型。wint_t 用于无符号的宽字符类型中,这里为 unsigned int 类型。offsetof 宏用于计算结构成员的地址偏移字节数。4 4

15、4 4、stdbool.hstdbool.hstdbool.hstdbool.h: 是 C99 中增加的,定义了布尔类型 bool,及其两个常量 false=0、true=1。_bool_true_false_are_defined=1 是标识布尔类型定义是否完成的信号。这些定义与 C+中的一致,因此标准 C+并不需要另外再支持 stdbool.h,但 GCC 提供了这个扩展,使得在 C+中可以支持。1./* ISO C Standard:7.16布尔类型及其值2.*/3.#ifndef _STDBOOL_H4.#define _STDBOOL_H5.#ifndef _cplusplus6.#

16、define bool_Bool/* C 中 */7.#define true18.#define false09.#else /* C+中 */10. /* 在 C+中支持是 GCC 的一个扩展 */11. #define _Boolbool12. #define boolbool13. #define falsefalse14. #define truetrue15. #endif /* _cplusplus */16. /* 标识布尔类型定义是否完成的信号*/17. #define _bool_true_false_are_defined118. #endif/* stdbool.h */5 5 5 5、stdarg.hstdarg.hstdarg.hstdarg.h: 访问可变参数表的类型和函数(用宏实现)。当你需要编写有可变参数表的函数时,比如myfunc(int *a,.),你就可以用 stdarg.h 中的各个函数来

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号