713 lines
25 KiB
Markdown
Raw Normal View History

# LIBRARY
---
## index
- [C](#c)
- [输入/输出 stdio](../universal/io.md)
- [资源管理和系统交互 stdlib](#stdlib)
2025-05-13 20:38:36 +08:00
- [字符串处理 string](../universal/cstring.md)
- [数学函数 math](#math)
- [字符处理 ctype](#ctype)
- [时间/日期 time](#time)
- [错误处理 errno](#errno)
- [断言 assert](#assert)
- [可变参数处理 stdarg](#stdarg)
- [信号处理 signal](#signal)
- [标准定义stddef](#stddef)
- [整数范围 limits](#limits)
- [浮点数特性 float](#float)
- [布尔类型(C99) stdbool](#stdbool)
- [固定大小整数(C99) stdint](#stdint)
- [复数运算(C99) complex](#complex)
- [泛型数学(C99) tgmath](#tgmath) : 类型泛型数学宏
- [浮点环境(C99) fenv](#fenv)
- [多线程支持(C11) threads](#threads)
- [原子操作(C11) stdatomic](#stdatomic)
- [Unicode支持(C11) uchar](#uchar)
- [CPP](#cpp)
- [STL](../STL/)
- [POSIX](#unistd)
- [SELF](#self)
- [offsetof](./self/offsetof.h)
- [string hash](./self/string_hash.c)
- [thread pool](./self/thread-pool.cpp)
2025-05-07 13:03:26 +08:00
- [BIT](./self/bit.h)
- [LOG](./self/log/log.h)
---
## **stdlib**
### 动态内存管理
- [看这里哦](../universal/dynamic-memory.md)
### 程序终止与控制
- `void exit(int status)`
- 正常终止程序并调用atexit里注册的函数
- 参数(返回码)设置为(`EXIT_SUCCESS``EXIT_FAILURE`)
- `void abort(void)`
- 异常终止程序,不执行清理操作,直接终止进程(触发 SIGABRT 信号)
- `int atexit(void (*func)(void))`
- 注册程序终止时执行的函数(按注册的逆序调用)
### 系统交互
- `int system(const char* command)`
- 执行操作系统命令
- 返回命令执行的状态码
- `char* getenv(const char* name)`
- 获取环境变量值
- 返回的字符串不可修改
### 随机数生成
- `int rand(void)`
- 生成伪随机数
- 范围 `0``RAND_MAX`
- `void srand(unsigned int seed)`
- 设置随机数种子,通常用 `time(NULL)` 初始化
### 搜索与排序
- `void qsort(void* base, size_t nmemb, size_t size,
int (*compar)(const void*, const void*));`
- 快速排序数组
- `void* bsearch(const void* key, const void* base,
size_t nmemb, size_t size,
int (*compar)(const void*, const void*));`
- 在已排序数组中二分查找元素
- 找到返回元素地址,否则返回 `NULL`
### 数值转换
- `atoi`,`atof`,`atol`
- 将字符串转换为整数、浮点数、长整数
- 无法检测错误
- `strtol`,`strtod`
- 更安全的字符串转换,可检测错误和进制
- `abs`,`labs`,`llabs`
- 返回 整数/长整数/长长整数 的绝对值
---
## **math**
### **1. 基本数学运算**
#### **(1) 绝对值函数**
| 函数 | 描述 | 示例 |
|------|------|------|
| `int abs(int x)` | 整数绝对值(在 `<stdlib.h>`) | `abs(-5) = 5` |
| `double fabs(double x)` | 浮点数绝对值 | `fabs(-3.14) = 3.14` |
| `long labs(long x)` | 长整数绝对值 | `labs(-100L) = 100` |
#### **(2) 幂与开方**
| 函数 | 描述 | 示例 |
|------|------|------|
| `double pow(double x, double y)` | 计算 \( x^y \) | `pow(2, 3) = 8.0` |
| `double sqrt(double x)` | 平方根 \( \sqrt{x} \) | `sqrt(16) = 4.0` |
| `double cbrt(double x)` (C99) | 立方根 \( \sqrt[3]{x} \) | `cbrt(27) = 3.0` |
| `double hypot(double x, double y)` | 计算 \( \sqrt{x^2 + y^2} \)(直角三角形的斜边) | `hypot(3, 4) = 5.0` |
#### **(3) 取整与余数**
| 函数 | 描述 | 示例 |
|------|------|------|
| `double ceil(double x)` | 向上取整 | `ceil(3.2) = 4.0` |
| `double floor(double x)` | 向下取整 | `floor(3.9) = 3.0` |
| `double round(double x)` (C99) | 四舍五入 | `round(3.5) = 4.0` |
| `double trunc(double x)` (C99) | 截断小数部分 | `trunc(3.9) = 3.0` |
| `double fmod(double x, double y)` | 浮点数取余 | `fmod(5.5, 2) = 1.5` |
| `double remainder(double x, double y)` (C99) | IEEE 754 标准余数 | `remainder(10, 3) = 1.0` |
### **2. 三角函数(角度单位:弧度)**
| 函数 | 描述 | 示例 |
|------|------|------|
| `double sin(double x)` | 正弦函数 | `sin(M_PI/2) ≈ 1.0` |
| `double cos(double x)` | 余弦函数 | `cos(0) = 1.0` |
| `double tan(double x)` | 正切函数 | `tan(M_PI/4) ≈ 1.0` |
| `double asin(double x)` | 反正弦(结果在 \([-π/2, π/2]\)) | `asin(1) ≈ 1.5708` |
| `double acos(double x)` | 反余弦(结果在 \([0, π]\)) | `acos(0) ≈ 1.5708` |
| `double atan(double x)` | 反正切(结果在 \([-π/2, π/2]\)) | `atan(1) ≈ 0.7854` |
| `double atan2(double y, double x)` | 计算 \( \arctan(y/x) \)(考虑象限) | `atan2(1, 1) ≈ 0.7854` |
**注意**
- 使用三角函数时,通常需要先转换角度为弧度:
```c
double degrees = 45.0;
double radians = degrees * (M_PI / 180.0);
printf("sin(45°) = %f\n", sin(radians));
```
- `M_PI` 不是标准 C 定义的常量,但大多数编译器支持(需 `#define _USE_MATH_DEFINES`).
### **3. 指数与对数函数**
| 函数 | 描述 | 示例 |
|------|------|------|
| `double exp(double x)` | 自然指数 \( e^x \) | `exp(1) ≈ 2.71828` |
| `double exp2(double x)` (C99) | \( 2^x \) | `exp2(3) = 8.0` |
| `double log(double x)` | 自然对数 \( \ln(x) \) | `log(10) ≈ 2.30259` |
| `double log10(double x)` | 常用对数 \( \log_{10}(x) \) | `log10(100) = 2.0` |
| `double log2(double x)` (C99) | 二进制对数 \( \log_2(x) \) | `log2(8) = 3.0` |
### **4. 双曲函数**
| 函数 | 描述 | 示例 |
|------|------|------|
| `double sinh(double x)` | 双曲正弦 | `sinh(1) ≈ 1.1752` |
| `double cosh(double x)` | 双曲余弦 | `cosh(0) = 1.0` |
| `double tanh(double x)` | 双曲正切 | `tanh(1) ≈ 0.7616` |
### **5. 误差与伽马函数(C99)**
| 函数 | 描述 |
|------|------|
| `double erf(double x)` | 误差函数 |
| `double erfc(double x)` | 互补误差函数 |
| `double tgamma(double x)` | 伽马函数 \( \Gamma(x) \) |
| `double lgamma(double x)` | \( \ln(\|\Gamma(x)\|) \) |
### **6. 浮点数操作**
| 函数 | 描述 |
|------|------|
| `double frexp(double x, int *exp)` | 分解浮点数为尾数和指数 |
| `double ldexp(double x, int exp)` | \( x \times 2^{exp} \) |
| `double modf(double x, double *intpart)` | 分离整数和小数部分 |
### **7. 其他函数**
| 函数 | 描述 |
|------|------|
| `double fmax(double x, double y)` (C99) | 返回较大值 |
| `double fmin(double x, double y)` (C99) | 返回较小值 |
| `double fdim(double x, double y)` (C99) | 返回 \( x - y \)(如果 \( x > y \),否则 0) |
| `double copysign(double x, double y)` (C99) | 返回 `x` 的绝对值 + `y` 的符号 |
### **8. 宏与常量**
| 宏 | 描述 |
|------|------|
| `INFINITY` | 表示无穷大(如 `1.0 / 0.0`) |
| `NAN` | 表示非数字(如 `0.0 / 0.0`) |
| `HUGE_VAL` | 表示极大值(溢出时返回) |
| `M_E` | 自然对数底 \( e \)(非标准) |
| `M_PI` | 圆周率 \( \pi \)(非标准) |
---
## **ctype**
`<ctype.h>` 是 C 语言标准库中用于**字符分类和转换**的头文件,提供了一系列函数用于判断字符的类型(如字母、数字、空白符等)以及大小写转换.这些函数通常以 `int` 类型参数(字符的 ASCII 值)作为输入,并返回 `int` 类型(非零表示真,零表示假).
### **1. 字符分类函数**
这些函数用于检查字符是否属于特定类别,返回 **非零值(真)****0(假)**.
| 函数 | 描述 | 示例 |
|------|------|------|
| `int isalpha(int c)` | 检查 `c` 是否是字母(`A-Z``a-z`) | `isalpha('A')` → 非零 |
| `int isdigit(int c)` | 检查 `c` 是否是数字(`0-9`) | `isdigit('5')` → 非零 |
| `int isalnum(int c)` | 检查 `c` 是否是字母或数字 | `isalnum('a')` → 非零 |
| `int isxdigit(int c)` | 检查 `c` 是否是十六进制数字(`0-9``A-F``a-f`) | `isxdigit('F')` → 非零 |
| `int islower(int c)` | 检查 `c` 是否是小写字母(`a-z`) | `islower('a')` → 非零 |
| `int isupper(int c)` | 检查 `c` 是否是大写字母(`A-Z`) | `isupper('A')` → 非零 |
| `int isspace(int c)` | 检查 `c` 是否是空白字符(` ``\t``\n``\r``\v``\f`) | `isspace(' ')` → 非零 |
| `int isblank(int c)` (C99) | 检查 `c` 是否是空白(` ``\t`) | `isblank('\t')` → 非零 |
| `int isprint(int c)` | 检查 `c` 是否是可打印字符(包括空格) | `isprint('A')` → 非零 |
| `int isgraph(int c)` | 检查 `c` 是否是可打印字符(**不包括空格**) | `isgraph(' ')` → 0 |
| `int iscntrl(int c)` | 检查 `c` 是否是控制字符(ASCII 0-31 或 127) | `iscntrl('\n')` → 非零 |
| `int ispunct(int c)` | 检查 `c` 是否是标点符号(非字母、数字、空格) | `ispunct('!')` → 非零 |
### **2. 字符转换函数**
| 函数 | 描述 | 示例 |
|------|------|------|
| `int tolower(int c)` | 将 `c` 转换为小写字母(如果 `c` 是大写字母) | `tolower('A')``'a'` |
| `int toupper(int c)` | 将 `c` 转换为大写字母(如果 `c` 是小写字母) | `toupper('a')``'A'` |
**注意**
- 如果 `c` 不是字母,`tolower()``toupper()` 直接返回 `c`.
- 这些函数只适用于 ASCII 字符,不适用于 Unicode.
---
## **time**
### **1. 时间表示方式**
#### **(1) `time_t`**
- `typedef long time_t;`(通常是自 1970-01-01 00:00:00 UTC 的秒数,即 **Unix 时间戳**)
- `time_t now = time(NULL); // 获取当前时间戳`
#### **(2) `struct tm`**
存储**分解时间**(Broken-Down Time),包含以下字段
```c
struct tm {
int tm_sec; // 秒 [0, 60](60 用于闰秒)
int tm_min; // 分钟 [0, 59]
int tm_hour; // 小时 [0, 23]
int tm_mday; // 月中的第几天 [1, 31]
int tm_mon; // 月份 [0, 11](0 = 一月)
int tm_year; // 自 1900 年起的年份
int tm_wday; // 星期几 [0, 6](0 = 周日)
int tm_yday; // 年中的第几天 [0, 365]
int tm_isdst; // 夏令时标志(>0: 夏令时,=0: 非夏令时,<0: 未知)
};
```
#### **(3) `clock_t`**
- `typedef long clock_t;`(表示 CPU 时间,单位通常是**时钟滴答**)
### **2. 时间获取函数**
#### **(1) `time()`**
- `time_t time(time_t *timer);`
- 获取当前日历时间(Unix 时间戳).
#### **(2) `clock()`**
- `clock_t clock(void);`
- 获取程序运行的 **CPU 时间**(单位是 `CLOCKS_PER_SEC` 的分数).
#### **(3) `difftime()`**
- `double difftime(time_t end, time_t start);`
- 计算两个 `time_t` 时间的差值(单位:秒).
### **3. 时间转换函数**
#### **(1) `gmtime()`**
- `struct tm *gmtime(const time_t *timer);`
-`time_t` 转换为 **UTC 时间**(世界标准时间).
#### **(2) `localtime()`**
- `struct tm *localtime(const time_t *timer);`
-`time_t` 转换为 **本地时间**(受时区和夏令时影响).
#### **(3) `mktime()`**
- `time_t mktime(struct tm *timeptr);`
-`struct tm` 转换回 `time_t`(自动调整非法时间).
#### **(4) `asctime()`**
- `char *asctime(const struct tm *timeptr);`
-`struct tm` 转换为固定格式的字符串(如 `"Sun Jan 1 00:00:00 2023\n"`).
#### **(5) `ctime()`**
- `char *ctime(const time_t *timer);`
-`time_t` 转换为本地时间的字符串
#### **(6) `strftime()`(更灵活的格式化)**
- `size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr);`
- `strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", t);`
- **功能**:自定义时间格式
- **常用格式符**
| 格式符 | 说明 | 示例 |
|--------|------|------|
| `%Y` | 年份(4 位) | 2024 |
| `%m` | 月份(01-12) | 02 |
| `%d` | 日(01-31) | 15 |
| `%H` | 小时(00-23) | 14 |
| `%M` | 分钟(00-59) | 30 |
| `%S` | 秒(00-60) | 45 |
| `%A` | 星期全名 | Monday |
| `%a` | 星期缩写 | Mon |
| `%B` | 月份全名 | February |
| `%b` | 月份缩写 | Feb |
| `%c` | 完整日期时间 | Mon Feb 15 14:30:45 2024 |
---
## **errno**
### **1. `errno` 全局变量**
`extern int errno; // 声明全局错误变量`
- 当标准库函数执行失败时,会设置 `errno` 为特定的错误码.
- **特点**
- 由系统或库函数自动设置,**程序启动时初始化为 0**(表示无错误).
- **每个线程有独立的 `errno`**(多线程安全).
- 必须在函数返回后**立即检查**,否则可能被后续操作覆盖.
### **2. 标准错误码宏**
| 宏 | 值 | 描述 |
|----|---|------|
| `EPERM` | 1 | 操作不允许(权限不足) |
| `ENOENT` | 2 | 文件或目录不存在 |
| `EINTR` | 4 | 系统调用被中断 |
| `EIO` | 5 | 输入/输出错误 |
| `EBADF` | 9 | 错误的文件描述符 |
| `EAGAIN` | 11 | 资源暂时不可用(可重试) |
| `ENOMEM` | 12 | 内存不足 |
| `EACCES` | 13 | 权限不足 |
| `EFAULT` | 14 | 错误的地址 |
| `EBUSY` | 16 | 资源忙 |
| `EEXIST` | 17 | 文件已存在 |
| `EINVAL` | 22 | 无效参数 |
| `ENFILE` | 23 | 系统打开文件数过多 |
| `EMFILE` | 24 | 进程打开文件数过多 |
| `ENOSPC` | 28 | 设备无剩余空间 |
| `EDOM` | 33 | 数学参数超出定义域 |
| `ERANGE` | 34 | 结果超出范围 |
### **3. 错误处理函数**
- **(1) `perror()`**
- `void perror(const char *s);`
- 打印错误描述(自动附加 `errno` 对应的错误信息).
- **(2) `strerror()`**
- `char *strerror(int errnum);`
- 返回错误码对应的字符串描述.
### **4. 使用场景**
- **(1) 文件操作错误处理**
- **(2) 数学函数错误处理**
- **(3) 动态内存分配错误**
### **5. 注意事项**
1. **`errno` 的线程安全性**
- 在多线程环境中,`errno` 是线程局部的(每个线程独立维护).
2. **`errno` 的初始化**
- 程序启动时 `errno` 为 0,调用成功**不会清零**(需手动重置).
3. **`errno` 的检查时机**
- 必须在函数返回后**立即检查**,否则可能被后续操作覆盖.
4. **不可直接修改 `errno`**
- 除非明确需要设置错误码,否则不应手动修改 `errno`.
---
## **assert**
`<assert.h>` 是 C 语言标准库中用于**程序断言(Assertion)**的头文件,它提供了一个宏 `assert()`,用于在程序运行时检查条件是否满足,如果条件为假(`false`),则终止程序并输出错误信息.
- `void assert(int expression);`
- 如果 `expression``0`(假)
1. 打印错误信息(包含文件名、行号、断言条件).
2. 调用 `abort()` 终止程序.
- 如果 `expression``0`(真),则不做任何操作.
- **2. 启用/禁用断言**
- **(1) 调试模式(默认启用)**
- 不定义 `NDEBUG` 宏,`assert()` 生效:
- **(2) 发布模式(禁用断言)**
- 定义 `NDEBUG` 宏,`assert()` 会被忽略
- **3. 使用场景**
- **(1) 检查函数参数合法性**
- **(2) 检查程序逻辑**
- **(3) 调试复杂条件**
- **4. 注意事项**
- 仅在 *调试模式(`NDEBUG` 未定义)* 下生效.
- 在发布版本中可以通过定义 `NDEBUG` 宏禁用断言.
- *`assert` 不能替代错误处理*
---
## **stdarg**
`<stdarg.h>` 是 C 语言标准库中用于处理**可变参数**的头文件,它允许函数接受不定数量的参数,类似于 `printf()``scanf()` 的实现方式。
### **1. 核心宏和类型**
#### **(1) `va_list`**
- 用于声明一个变量,该变量将保存可变参数列表
#### **(2) `va_start`**
- **宏**`void va_start(va_list ap, last_arg);`
- **功能**:初始化 `va_list` 使其指向第一个可变参数
- **参数**
- `ap``va_list` 对象
- `last_arg`:最后一个固定参数的名称
#### **(3) `va_arg`**
- **宏**`type va_arg(va_list ap, type);`
- **功能**:获取下一个参数的值
- **参数**
- `ap``va_list` 对象
- `type`:期望获取的参数类型
- **示例**
```c
int num = va_arg(args, int);
```
#### **(4) `va_end`**
- **宏**`void va_end(va_list ap);`
- **功能**:清理 `va_list` 对象
- **注意**:必须在使用完参数后调用
- **示例**
```c
va_end(args);
```
### **3. 重要注意事项**
1. **没有类型检查**
- 编译器无法验证参数类型,错误使用会导致未定义行为
- **错误示例**
```c
int num = va_arg(args, double); // 如果传入的是int将导致未定义行为
```
2. **必须知道参数数量**
- 通常第一个参数用于指定后续参数的数量(如`printf`使用格式化字符串)
3. **必须调用`va_end`**
- 忘记调用可能导致内存泄漏或崩溃
4. **避免类型混用**
- 如果函数期望`int`但传入`float`,行为是未定义的
### **5. 总结**
| **宏/类型** | **功能** |
|------------|---------|
| `va_list` | 保存可变参数列表 |
| `va_start` | 初始化参数列表 |
| `va_arg` | 获取下一个参数 |
| `va_end` | 清理参数列表 |
---
## **signal**
### **信号概述**
- *信号* 是操作系统发送给进程的一种异步通知,用于告知进程发生了某种事件
- 由以下方式触发
- Ctrl - C
- 硬件异常
- 其他进程发送
- 操作系统事件
- **标准信号列表**
|信号 |值 |行为 |描述 |
|--------|----|------|----------------------|
|SIGHUP |1 |A |挂起或控制进程终止 |
|SIGINT |2 |A |C + c |
|SIGFPE |8 |C |浮点异常 |
|SIGKILL |9 |AEF |kill -9 强制杀死 |
|SIGSEGV |11 |C |无效的内存引用 |
|SIGPIPE |13 |A |管道破裂 |
|SIGALRM |14 |A |闹钟alarm()信号 |
|SIGTERM |15 |A |kill默认 |
|SIGCHLD |17 |B |子进程结束 |
- A 终止进程
- B 忽略
- C 终止进程并core dump
- D 暂停
- E 不能捕获
- F 不可忽略
- **信号处理函数**
- `void (*signal(int sig, void (*handler)(int)))(int);`
- 设置信号 sig 的处理函数 handler
- handler : `SIG_IGN``SIG_DFL` 或信号处理函数
- 成功:返回之前的信号处理函数
- 失败:返回 `SIG_ERR`
- `signal(SIGINT, handler); // 捕获 Ctrl+C`
- `int raise(int sig);`
- 向当前进程发送信号 `sig`
- **实际开发的使用场景**
- 捕获 `SIGTERM` 进行资源清理
- 忽略 `SIGINT` 让程序不被 `Ctrl+C` 杀死
- 捕获 `SIGSEGV` 记录错误信息
- 使用 `SIGALRM` 实现超时机制
---
## **stddef**
定义基本类型和宏的头文件,提供与平台无关的类型定义和常用常量,在各种底层编程和跨平台开发中非常有用
1. **核心定义**
- `#define NULL ((void *)0)`
- 表示空指针
- `typedef unsigned int size_t;`
- 实际类型取决于平台
- `typedef int ptrdiff_t;`
- 指针差值类型,表示两个指针之间的差值
- 实际类型取决于平台
- `#define offsetof(type, member) ((size_t)&(((type *)0)->member))`
- 计算结构体成员的字节偏移量
- `typedef unsigned short wchar_t;`
- 宽字符类型
- 实际类型取决于平台
2. 跨平台注意
- `size_t`实际大小
- 32 位系统通常是 `unsigned int`
- 64 位系统通常是 `unsigned long`
- NULL 的实现差异
- C 中定义为 `((void *)0)`
- C++ 中可能是 `0``nullptr`
- 偏移量计算的限制:`offsetof`不能用于非标准布局类型(如含虚函数的 C++ 类)
---
## **limits**
定义基本数据类型取值范围,提供了各种整数类型的最大值和最小值的宏定义
- **1. 核心宏定义**
| 宏 | 含义 | 典型值32位系统 |
|----|------|------------------|
| `CHAR_BIT` | 一个字节的位数 | 8 |
| `SCHAR_MIN` | `signed char` 最小值 | -128 |
| `SCHAR_MAX` | `signed char` 最大值 | 127 |
| `UCHAR_MAX` | `unsigned char` 最大值 | 255 |
| `CHAR_MIN` | `char` 最小值(取决于实现) | -128 或 0 |
| `CHAR_MAX` | `char` 最大值(取决于实现) | 127 或 255 |
| `SHRT_MIN` | `short` 最小值 | -32768 |
| `SHRT_MAX` | `short` 最大值 | 32767 |
| `USHRT_MAX` | `unsigned short` 最大值 | 65535 |
| `INT_MIN` | `int` 最小值 | -2147483648 |
| `INT_MAX` | `int` 最大值 | 2147483647 |
| `UINT_MAX` | `unsigned int` 最大值 | 4294967295 |
| `LONG_MIN` | `long` 最小值 | -2147483648 |
| `LONG_MAX` | `long` 最大值 | 2147483647 |
| `ULONG_MAX` | `unsigned long` 最大值 | 4294967295 |
| `LLONG_MIN` (C99) | `long long` 最小值 | -9223372036854775808 |
| `LLONG_MAX` (C99) | `long long` 最大值 | 9223372036854775807 |
| `ULLONG_MAX` (C99) | `unsigned long long` 最大值 | 18446744073709551615 |
- `<limits.h>` 主要用于
- **防止数值溢出**
- **编写可移植代码**
- **系统属性检测**
- **安全输入验证**
---
## float
`<float.h>` 是 C 语言标准库中定义**浮点数特性**的头文件,它提供了浮点类型的取值范围、精度和误差相关的宏定义。
- **1. 核心宏定义**
| 宏 | 含义 | 典型值IEEE 754 |
|----|------|------------------|
| `FLT_RADIX` | 浮点数基数(通常为 2 | 2 |
| `FLT_MANT_DIG` | `float` 尾数位数 | 24 |
| `DBL_MANT_DIG` | `double` 尾数位数 | 53 |
| `LDBL_MANT_DIG` | `long double` 尾数位数 | 64 |
| `FLT_MIN` | `float` 最小正规范化值 | 1.175494e-38 |
| `FLT_MAX` | `float` 最大值 | 3.402823e+38 |
| `DBL_MIN` | `double` 最小正规范化值 | 2.225074e-308 |
| `DBL_MAX` | `double` 最大值 | 1.797693e+308 |
| `LDBL_MIN` | `long double` 最小正规范化值 | 3.362103e-4932 |
| `LDBL_MAX` | `long double` 最大值 | 1.189731e+4932 |
| `FLT_DIG` | `float` 的十进制有效数字 | 6 |
| `DBL_DIG` | `double` 的十进制有效数字 | 15 |
| `LDBL_DIG` | `long double` 的十进制有效数字 | 18 |
| `FLT_EPSILON` | `float` 的最小可表示差值 | 1.192093e-07 |
| `DBL_EPSILON` | `double` 的最小可表示差值 | 2.220446e-16 |
| `LDBL_EPSILON` | `long double` 的最小可表示差值 | 1.084202e-19 |
| `FLT_ROUNDS` | 当前浮点数舍入模式 |
- `<float.h>` 主要用于:
- **浮点数安全比较**
- **数值范围验证**
- **精度控制**
- **跨平台浮点运算**
---
## stdbool
用于布尔类型支持的头文件,C99 引入,提供了更清晰的布尔类型定义
1. **核心定义**
```#define bool _Bool
#define true 1
#define false 0
#define __bool_true_false_are_defined 1
```
---
## stdint
定义固定宽度整数类型的头文件,C99,提供了明确位宽的整数类型
1. **核心整数类型定义**
| 类型 | 位宽 | 取值范围 | 对应传统类型 |
|------|------|----------|--------------|
| `int8_t` | 8位 | -128 ~ 127 | `signed char` |
| `uint8_t` | 8位 | 0 ~ 255 | `unsigned char` |
| `int16_t` | 16位 | -32768 ~ 32767 | `short` |
| `uint16_t` | 16位 | 0 ~ 65535 | `unsigned short` |
| `int32_t` | 32位 | -2147483648 ~ 2147483647 | `int` |
| `uint32_t` | 32位 | 0 ~ 4294967295 | `unsigned int` |
| `int64_t` | 64位 | -2^63 ~ 2^63-1 | `long long` |
| `uint64_t` | 64位 | 0 ~ 2^64-1 | `unsigned long long` |
| `int_least8_t` | 至少8位的有符号整数 |
| `uint_least8_t` | 至少8位的无符号整数 |
| ...16/32/64位同理 | ... |
| `int_fast8_t` | 最快处理的至少8位有符号整数 |
| `uint_fast8_t` | 最快处理的至少8位无符号整数 |
| ...16/32/64位同理 | ... |
| `intmax_t` | 系统支持的最大有符号整数 |
| `uintmax_t` | 系统支持的最大无符号整数 |
| `intptr_t` | 可保存指针值的有符号整数 |
| `uintptr_t` | 可保存指针值的无符号整数 |
2. **极限值宏定义**
| 宏 | 含义 |
|----|------|
| `INT8_MIN`/`INT8_MAX` | `int8_t` 的最小/最大值 |
| `UINT8_MAX` | `uint8_t` 的最大值 |
| `INTMAX_MIN`/`INTMAX_MAX` | `intmax_t` 的极限值 |
| `UINTMAX_MAX` | `uintmax_t` 的最大值 |
| `PTRDIFF_MIN`/`PTRDIFF_MAX` | `ptrdiff_t` 的极限值 |
| `SIZE_MAX` | `size_t` 的最大值 |
3. **格式化输出宏**
| 宏 | 对应类型 | 格式化字符串 |
|----|----------|--------------|
| `PRIi8`/`PRIu8` | `int8_t`/`uint8_t` | `%hhd`/`%hhu` |
| `PRIi16`/`PRIu16` | `int16_t`/`uint16_t` | `%hd`/`%hu` |
| `PRIi32`/`PRIu32` | `int32_t`/`uint32_t` | `%d`/`%u` |
| `PRIi64`/`PRIu64` | `int64_t`/`uint64_t` | `%lld`/`%llu` |
| `PRIiMAX`/`PRIuMAX` | `intmax_t`/`uintmax_t` | `%jd`/`%ju` |
- `<stdint.h>` 为 C 语言带来了:
- **精确的位宽控制**
- **更好的跨平台兼容性**
- **更安全的数值操作**
---
## **unistd**
- 进程控制
- [fork](../linux/fork.cpp)
- [exec](../linux/exec.cpp)
- `unsigned int sleep(unsigned int seconds);`
- 文件操作
- `ssize_t read(int fildes, void *buf, size_t nbyte);`
- 共享偏移量
- `ssize_t pread(int fildes, void *buf, size_t nbyte, off_t offset);`
- 指定偏移量,线程安全
- `ssize_t write(int fildes, const void *buf, size_t nbyte);`
- `ssize_t pwrite(int fildes, const void *buf, size_t nbyte);`
- `int clos(int fildes);`
- 管道操作
- `int pipe(int fildes[2]);`
- 创建匿名管道
- [0]读
- [1]写
- 0 成功 -1 失败
- `uid_t getuid(void);`
- 获取用户真实uid
- 目录操作
- `int chdir(const char *path);`
- 切换工作目录
- 0 成功 -1 失败
- `char *getcwd(char buf[.size], size_t size);`
- 其他
- `int dup(int fildes);`
- `int dup2(int fildes, int fildes2);`
- 复制文件描述符
- `int isatty(int fd);`
- 检查文件描述符是否关联到终端
---