引言
iso646.h 是一个定义了运算符别名的头文件,用来处理 ISO646 标准字符集不支持的运算操作;limits.h 被封装成了 climits,里面定义了一系列数据类型的最大值最小值。
iso646.h
该头文件在 C++中的封装 ciso646 其实没有 #include "iso646.h",因为 C++中是以关键字的形式定义了这些别名的。
代码位置:http://www.aospxref.com/android-12.0.0_r3/xref/external/libcxx/include/ciso646
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
复制代码
我们来看头文件中的定义:
代码位置:http://www.aospxref.com/android-12.0.0_r3/xref/external/clang/lib/Headers/iso646.h
可以看到,实际上是,只有在未定义__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,将其中相关的定义也包含进来了。
代码位置:http://www.aospxref.com/android-12.0.0_r3/xref/bionic/libc/include/limits.h
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 相关的宏,
如下:http://www.aospxref.com/android-12.0.0_r3/xref/bionic/libc/kernel/uapi/linux/limits.h比如管道的 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
复制代码
http://www.aospxref.com/android-12.0.0_r3/xref/bionic/libc/include/bits/posix_limits.h
posix_limits.h 定义了一系列与其相关的宏定义,这里就不展开说明了。
评论