C++学习------iso646.h与limits.h头文件的源码学习

254 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情

引言

iso646.h是一个定义了运算符别名的头文件,用来处理ISO646标准字符集不支持的运算操作; limits.h被封装成了climits,里面定义了一系列数据类型的最大值最小值。

iso646.h

该头文件在C++中的封装ciso646其实没有#include "iso646.h",因为C++中是以关键字的形式定义了这些别名的。

代码位置: www.aospxref.com/android-12.…

11 #ifndef _LIBCPP_CISO646
12 #define _LIBCPP_CISO646
13 
14 /*
15     ciso646 synopsis
16 
17 */
18 
19 #include <__config>
20 
21 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
22 #pragma GCC system_header
23 #endif
24 
25 #endif  // _LIBCPP_CISO646

我们来看头文件中的定义:

代码位置:www.aospxref.com/android-12.… 可以看到,实际上是,只有在未定义__cplusplus时,才定义如下的宏,即将我们常用的运算符定义为字符拼写意义,如:&& 增加别名为 and,依次类似。

26  #ifndef __ISO646_H
27  #define __ISO646_H
28  
29  #ifndef __cplusplus
30  #define and    &&
31  #define and_eq &=
32  #define bitand &
33  #define bitor  |
34  #define compl  ~
35  #define not    !
36  #define not_eq !=
37  #define or     ||
38  #define or_eq  |=
39  #define xor    ^
40  #define xor_eq ^=
41  #endif
42  
43  #endif /* __ISO646_H */

limits.h

定义了一系列最值宏常量,最开始include了float.h和linux/limits.h,将其中相关的定义也包含进来了。

代码位置:www.aospxref.com/android-12.…

40  /* Historically bionic exposed the content of <float.h> from <limits.h> and <sys/limits.h> too. */
41  #include <float.h>
42  
43  #include <linux/limits.h>

float.h

定义了一系列有关浮点数的宏,这里就不展开了。

linux/limits.h

定义了一系列与linux相关的宏,

如下: www.aospxref.com/android-12.… 比如管道的buffer大小,路径的长度,等。

19  #ifndef _UAPI_LINUX_LIMITS_H
20  #define _UAPI_LINUX_LIMITS_H
21  #define NR_OPEN 1024
22  #define NGROUPS_MAX 65536
23  #define ARG_MAX 131072
24  #define LINK_MAX 127
25  #define MAX_CANON 255
26  #define MAX_INPUT 255
27  #define NAME_MAX 255
28  #define PATH_MAX 4096
29  #define PIPE_BUF 4096
30  #define XATTR_NAME_MAX 255
31  #define XATTR_SIZE_MAX 65536
32  #define XATTR_LIST_MAX 65536
33  #define RTSIG_MAX 32
34  #endif

操作系统使用的量

如密码的长度等。

45  #define PASS_MAX		128	/* _PASSWORD_LEN from <pwd.h> */
46  
47  #define NL_ARGMAX		9
48  #define NL_LANGMAX		14
49  #define NL_MSGMAX		32767
50  #define NL_NMAX			1
51  #define NL_SETMAX		255
52  #define NL_TEXTMAX		255
53  
54  #define TMP_MAX                 308915776

数据类型的大小

依次定义了CHAR_BIT、LONG_BIT、WORD_BIT、char/unsigned char/signed char、short/unsigned short、int/unsigned int、long/unsigned long、long long/unsigned long long的大小,同时区分32位机器和64位机器。

58  #define CHAR_BIT 8
59  #ifdef __LP64__
60  # define LONG_BIT 64
61  #else
62  # define LONG_BIT 32
63  #endif
64  #define WORD_BIT 32
65  
66  #define	SCHAR_MAX	0x7f		/* max value for a signed char */
67  #define SCHAR_MIN	(-0x7f-1)	/* min value for a signed char */
68  
69  #define	UCHAR_MAX	0xffU		/* max value for an unsigned char */
70  #ifdef __CHAR_UNSIGNED__
71  # define CHAR_MIN	0		/* min value for a char */
72  # define CHAR_MAX	0xff		/* max value for a char */
73  #else
74  # define CHAR_MAX	0x7f
75  # define CHAR_MIN	(-0x7f-1)
76  #endif
77  
78  #define	USHRT_MAX	0xffffU		/* max value for an unsigned short */
79  #define	SHRT_MAX	0x7fff		/* max value for a short */
80  #define SHRT_MIN        (-0x7fff-1)     /* min value for a short */
81  
82  #define	UINT_MAX	0xffffffffU	/* max value for an unsigned int */
83  #define	INT_MAX		0x7fffffff	/* max value for an int */
84  #define	INT_MIN		(-0x7fffffff-1)	/* min value for an int */
85  
86  #ifdef __LP64__
87  # define ULONG_MAX	0xffffffffffffffffUL     /* max value for unsigned long */
88  # define LONG_MAX	0x7fffffffffffffffL      /* max value for a signed long */
89  # define LONG_MIN	(-0x7fffffffffffffffL-1) /* min value for a signed long */
90  #else
91  # define ULONG_MAX	0xffffffffUL	/* max value for an unsigned long */
92  # define LONG_MAX	0x7fffffffL	/* max value for a long */
93  # define LONG_MIN	(-0x7fffffffL-1)/* min value for a long */
94  #endif
95  
96  # define ULLONG_MAX	0xffffffffffffffffULL     /* max value for unsigned long long */
97  # define LLONG_MAX	0x7fffffffffffffffLL      /* max value for a signed long long */
98  # define LLONG_MIN	(-0x7fffffffffffffffLL-1) /* min value for a signed long long */

针对Glibc的定义增加

为了兼容更多的库,针对Glibc增加了一些相关的定义 如与uid_t/gid_t相关的范围取值,size_t的取值范围

116  #if defined(__USE_BSD) || defined(__BIONIC__) /* Historically bionic exposed these. */
117  # define UID_MAX	UINT_MAX	/* max value for a uid_t */
118  # define GID_MAX	UINT_MAX	/* max value for a gid_t */
119  #if defined(__LP64__)
120  #define SIZE_T_MAX ULONG_MAX
121  #else
122  #define SIZE_T_MAX UINT_MAX
123  #endif
124  #endif

针对一些特定量的设置,如MB_LEN_MAX,SEM_VALUE_MAX等

132  #define MB_LEN_MAX 4
133  
134  #define NZERO 20
135  
136  #define IOV_MAX 1024
137  #define SEM_VALUE_MAX 0x3fffffff

针对POSIX的兼容

如:pthread_t相关的值,

140  #include <bits/posix_limits.h>
141  
142  #define HOST_NAME_MAX _POSIX_HOST_NAME_MAX
143  #define LOGIN_NAME_MAX 256
144  #define TTY_NAME_MAX 32
145  
146  /* >= _POSIX_THREAD_DESTRUCTOR_ITERATIONS */
147  #define PTHREAD_DESTRUCTOR_ITERATIONS 4
148  /* >= _POSIX_THREAD_KEYS_MAX */
149  #define PTHREAD_KEYS_MAX 128
150  /* bionic has no specific limit */
151  #undef PTHREAD_THREADS_MAX

www.aospxref.com/android-12.… posix_limits.h定义了一系列与其相关的宏定义,这里就不展开说明了。