关于 C 标准库
C 标准库是 C 语言的标准组成部分,提供了一系列预定义的函数、宏和类型定义。
它包含了以下主要组件:
- 标准输入输出
- 字符串处理
- 数学运算
- 内存管理
- 时间和日期处理
- 错误处理
- 类型转换
- 算法和数据结构等功能
- 泛型数学运算
- 多线程支持
头文件
<stdio.h>
提供输入输出功能,包括:
- 文件操作(如
fopen(),fclose(),fread(),fwrite()) - 格式化输入输出(如
printf(),scanf(),fprintf(),fscanf()) - 字符和字符串的输入输出(如
getchar(),putchar(),gets(),puts()) - 缓冲区控制(如
fflush(),setvbuf()) - 文件定位(如
fseek(),ftell(),rewind())
等。
<stdlib.h>
提供通用工具函数,包括:
- 动态内存分配(如
malloc(),calloc(),realloc(),free()) - 随机数生成(如
rand(),srand()) - 整数算术(如
abs(),div(),labs()) - 搜索和排序(如
qsort(),bsearch()) - 环境交互(如
system(),getenv(),exit()) - 字符串转换(如
atoi(),atof(),strtol())
等。
<string.h>
提供字符串操作函数,用于:
- 字符串复制和连接(如
strcpy(),strncpy(),strcat(),strncat()) - 字符串比较(如
strcmp(),strncmp(),strcoll()) - 字符串搜索(如
strchr(),strstr(),strspn(),strpbrk()) - 内存操作(如
memcpy(),memmove(),memset(),memcmp()) - 字符串长度计算(如
strlen(),strnlen_s())
等。
<math.h>
提供数学函数,包括:
- 三角函数(如
sin(),cos(),tan(),asin()) - 双曲函数(如
sinh(),cosh(),tanh()) - 指数和对数(如
exp(),log(),log10()) - 幂运算(如
pow(),sqrt()) - 取整函数(如
ceil(),floor(),round()) - 绝对值和余数(如
fabs(),fmod())
等。
<time.h>
提供时间和日期功能:
- 时间测量(如
time(),clock(),difftime()) - 时间转换(如
localtime(),gmtime(),mktime()) - 格式化时间显示(如
strftime(),asctime(),ctime()) - 日期计算和时间操作
- 时区处理
<stdint.h>
提供固定宽度整数类型和相关宏:
- 精确宽度整数类型(如
int8_t,int16_t,int32_t,int64_t) - 最小宽度类型(如
int_least8_t,int_least16_t) - 最快最小宽度类型(如
int_fast8_t,int_fast16_t) - 指针整数类型(如
intptr_t,uintptr_t) - 最大宽度整数类型(如
intmax_t,uintmax_t) - 整数常量宏(如
INT8_MIN,INT8_MAX,UINT8_MAX)
等。
<ctype.h>
提供字符分类和转换函数:
- 字符分类(如
isalpha(),isdigit(),isspace(),ispunct()) - 字符转换(如
toupper(),tolower()) - 区域设置相关的字符处理
等。
<assert.h>
提供断言功能:
- 运行时断言检查(
assert()宏) - 编译时静态断言(
static_assert) - 调试辅助功能
<signal.h>
提供信号处理功能:
- 信号处理函数注册(
signal()) - 信号发送(
raise()) - 异常处理支持
<locale.h>
提供本地化支持:
- 区域设置控制(
setlocale()) - 本地化数据访问(
localeconv()) - 多语言支持
<threads.h>
提供多线程支持(C11 起):
线程管理:
thrd_create()- 创建新线程thrd_join()- 等待线程结束thrd_detach()- 分离线程thrd_current()- 获取当前线程thrd_exit()- 终止当前线程
互斥量:
mtx_init()- 初始化互斥量mtx_lock()- 加锁mtx_unlock()- 解锁mtx_destroy()- 销毁互斥量
条件变量:
cnd_init()- 初始化条件变量cnd_signal()- 唤醒一个等待线程cnd_broadcast()- 唤醒所有等待线程cnd_wait()- 等待条件变量cnd_destroy()- 销毁条件变量
线程局部存储:
tss_create()- 创建线程特定存储tss_get()- 获取线程特定值tss_set()- 设置线程特定值tss_delete()- 删除线程特定存储
<stdatomic.h>
提供原子操作支持(C11 起):
- 原子类型定义(如
atomic_int,atomic_ptr) - 原子操作函数(如
atomic_store(),atomic_load(),atomic_exchange(),atomic_compare_exchange())
<complex.h>
提供复数运算支持:
- 复数类型定义(
complex) - 复数运算函数
- 复数三角函数
- 复数指数和对数函数
<tgmath.h>
提供泛型数学函数支持:
- 自动类型识别的数学函数
- 支持实数和复数运算
- 包含
<math.h>和<complex.h>的泛型版本 - 通过宏实现类型通用的数学运算
<stdbit.h>
提供位操作函数和宏(C23 起):
- 位旋转:
rotl(),rotr()(左旋、右旋) - 位计数:
countl_zero(),countl_one(),countr_zero(),countr_one(),popcount()(计算 0/1 位) - 位宽:
bit_width()(有效位数) - 第一个设置位:
has_single_bit(),bit_ceil(),bit_floor() - 字节序:
__STDC_ENDIAN_LITTLE__,__STDC_ENDIAN_BIG__,__STDC_ENDIAN_NATIVE__
<stdckdint.h>
提供检查整数运算,防止溢出漏洞(C23 起):
- 检查算术(宏):
ckd_add,ckd_sub,ckd_mul
注意
- 在使用标准库函数前,确保包含相应的头文件
- 注意函数的返回值和错误处理,了解函数的使用限制,避免发生错误或未定义行为
- 优先使用标准库函数而不是自己实现的函数
独立实现和宿主实现
C 语言的实现环境可以分为两种类型:freestanding(独立实现)和 hosted(宿主实现)。
独立实现
独立环境是一个最小化的执行环境,通常用于:
- 嵌入式系统
- 操作系统内核
- 引导加载程序
- 其他不依赖操作系统的程序
在独立环境中,只保证提供以下头文件:
<float.h><iso646.h><limits.h><stdalign.h><stdarg.h><stdbool.h><stddef.h><stdint.h>
这些头文件提供了基本的类型定义、常量和宏,但不包含任何需要操作系统支持的功能。
宿主环境
宿主环境是完整的 C 执行环境,通常运行在操作系统之上。它提供:
- 完整的 C 标准库支持
- 文件操作能力
- 内存管理功能
- 进程控制
- 标准输入输出
宿主环境包含所有 C 标准库头文件。
实际应用
Freestanding 环境的应用
嵌入式系统开发
- 单片机程序开发
- 实时操作系统(RTOS)的内核开发
- 设备驱动程序
操作系统开发
- 内核初始化代码
- 启动引导程序
- 底层系统组件
宿主环境的应用
- 应用程序开发
- 桌面应用程序
- 命令行工具
- 服务器程序
选择环境的考虑因素
硬件限制
- 如果目标平台资源受限,可能需要选择 freestanding 环境
- 如果有完整的操作系统支持,通常选择宿主环境
功能需求
- 需要标准库支持时,选择宿主环境
- 需要直接控制硬件时,选择 freestanding 环境
性能要求
- freestanding 环境可以实现更精确的系统控制
- 宿主环境提供更好的开发效率和可移植性