简单理解:C标准库是规范,CRT是实现
1. C标准库
C标准库是C语言标准(如C89、C99、C11等)中明确规定的一套头文件和函数的集合。它是一个规范和接口,定义了函数名、参数、返回值和行为。
- C 标准库是规范,而CRT是实现;
- CRT 实现了C 标准库,当我们说“链接C标准库”时,技术上是在链接CRT中实现标准库的那一部分;
不同的编译器供应商(如Microsoft、GNU、Clang)都会根据C标准提供自己的CRT实现,其中就包含了完全符合标准的C标准库实现,但也可能包含一些自己扩展的函数。
2. C运行时库
C运行时库是C语言程序在启动和运行时所需的一系列底层库文件的集合;
为C程序提供一个标准、可移植的运行环境,尤其是在程序的主函数main()被调用的前后,处理必要的初始化工作。
- C标准库的实现就包含在C运行时库中。可以将CRT理解为一个更大的包裹,里面包含了C标准库以及其他一些程序运行所必须的底层代码;
- 在不同的操作系统和编译器上,CRT的具体文件名不同:
- Windows(MSVC):例如
libcmt.lib
(静态链接多线程版)、msvcrt.lib
(动态链接版); - Linux(GCC):例如
libc.so
(动态库) 或libc.a
(静态库),通常指的是GNU C Library (glibc
);
- Windows(MSVC):例如
3. C运行时库与C标准库的对比
特性 |
C运行时库 (CRT) |
C标准库 |
角色 |
实现和支撑 |
规范和接口 |
范围 |
更大,包含标准库、启动代码、底层IO等 |
是CRT的一个子集 |
依赖性 |
程序运行必须依赖它 |
程序逻辑可以依赖它(如果不用标准函数,也可以不依赖) |
例子 |
|
|
C运行时库的主要功能包括
- 启动与终止:在main() 函数执行前,设置环境变量、初始化全局/静态变量、准备命令行参数argc和argv。在main() 退出后,负责清理资源,调用atexit()注册的函数。
- 底层 I/O 支持:printf, scanf, fopen等标准I/O函数提供对操作系统底层I/O操作;
- 堆内存管理:malloc(), calloc(), realloc(), free()等函数,用于管理程序的堆空间;
- 异常处理:提供结构化异常处理(SEH)等机制的支持
C标准库的主要功能包括
- 输入/输出 (
stdio.h
):printf
,scanf
,fgets
,fopen
等; - 字符串操作 (
string.h
):strcpy
,strlen
,strcmp
,memcpy
,memset
等; - 内存管理 (
stdlib.h
):malloc
,free
,calloc
等; - 数学函数 (
math.h
):sin
,cos
,sqrt
等; - 工具函数 (
stdlib.h
):rand
,srand
,atoi
等; - 时间与日期 (
time.h
):time
,clock
等;
(从概念和功能上简单理解提到这两个词的时候是在指什么内容,避免混淆概念)