什么是 C 和 C++ 标准库?

本文简要介绍编写 C/C++ 应用程序的领域,标准库的作用以及它是如何在各种操作系统中实现的 。

什么是 C 和 C++ 标准库?

文章插图
 
C 和 C++ 是如何制订的
当我们谈论 C 和 C++ 时,实际上是指一组定义(程序)语言应该做些什么,如何表现,应该提供哪些功能的规则 。C/C++ 的编译器为了处理 C/C++ 编写的源代码必须跟随着这些规则,并生成二进制应用程序 。听起来非常接近于 html:浏览器遵循着一组指令,所以它们可以以明确的方式来渲染网页 。
与 HTML 一样,C 和 C++ 的规则都是理论上的 。国际标准化组织(ISO)的一大群人每年都会聚集几次来讨论和定义语言规则 。没错,C 和 C++ 是标准化的东西 。他们最终都会得到一本官方的叫标准的书,你可以从他们的网站中购买 。随着语言的发展新的 papers(指官方的叫标准的书)会被发布,每一次都定义一个新的标准 。这就是为什么我们会有不同的 C 和 C++ 版本的原因:C99, C11, C++03, C++11, C++14 等等,数字与出版/发布年份相符 。
这些标准都市非常详细和有技术新的文档:我不会把它们当作手册 。通常会分为两部分:
● 1.C/C++ 的功能和特性;
● 2.C/C++ 的 API-- 开发人员可以用于他们的 C/C++ 程序的一个类、函数和宏的集合 。它也被称为标准库 。
例如,这里有个来自于 C 标准库第一部分的摘选,它定义了 main 函数的结构:
什么是 C 和 C++ 标准库?

文章插图
 
1.main 的定义,程序启动时调用的函数 。
这是另外一个来自与同样标准的摘录,描述了 CAPI 的成员 --fmin 函数:
什么是 C 和 C++ 标准库?

文章插图
 
2.在 math.h 文件中定义 min 函数 。
如你所见,几乎没涉及到代码 。有人必须阅读标准并将其转换成计算机可以消化的东西 。这是工作于编译器和(功能)实现上人们所做的:前者是一种可以读取和处理 C 和 C++ 源文件的工具,后者将标准库转换为代码 。我们来深入了解一下 。
C 标准库
C 标准库也称为 ISO C 库,是用于完成诸如输入/输出处理、字符串处理、内存管理、数学计算和许多其他操作系统服务等任务的宏、类型和函数的集合 。它是在 C 标准中(例如 C11 标准)中定义的 。其内容分布在不同的头文件中,比如上面我所提到的 math.h 。
 
C++ 标准库
和 C 标准库的概念类似,但仅针对 C++ 。C++ 标准库是一组 C++ 模板类,它提供了通用的编程数据结构和函数,如链表、堆、数组、算法、迭代器和任何其他你可以想到的 C++ 组件 。C++ 标准库也包含了 C 标准库,并在 C++ 标准中进行了定义(例如 C++ 11 标准) 。
实现 C/C++ 标准库
我们从这里开始讨论真正的代码了 。从事于标准库实现的开发者阅读官方的 ISO 规范并将其转化为代码 。他们必须依赖其操作系统所提供的功能(读/写文件,分配内存,创建线程,......所有这些被称为系统调用),因此每个平台都有其自己的标准库实现 。有时它是系统内核的一部分,有时它是作为一个附加组件 - 编译器 - 必须单独下载 。
GNU/linux 版实现
GNU C 库,也称为 glibc, 是 C 标准库的 GNU 项目实现 。并非所有的标准 C 函数都可以在 glibc 中找到:大多数数学函数实际上是在 libm 库中实现的,这是一个独立的库 。
至今,glibc 是 Linux 上使用最广泛的 C 库 。然而,在 90 年代期间,有一段时间里,glibc 有一个竞争对手称为 Linux libc(或者简称 libc),它是由 glibc 1.x 的一个分支产生的 。在一段时间里,Linux libc 是许多 Linux 发行版中的标准 C 库 。
经过多年的发展,glibc 竟然比 Linux libc 更具优势,并且所有使用它的 Linux 发行版都切换回了 glibc 。所以,如果你在你的磁盘中找到一个名为 libc.so.6 的文件,请不要担心:它是现代版的 glibc 。为了避免与之前的 Linux libc 版本混淆,版本号增加到了 6(他们无法将其命名为 glibc.so.6:所有Linux库都必须以 lib 前缀打头) 。
另一方面,C++ 标准库的实现位于 libstdc++ 或 GNU 标准 C++ 库中 。这是一个正在进行的在 GNU/Linux 上实现标准 C++ 库的项目 。一般来说,所有常规的 Linux 发行版都默认使用 libstdc++ 。
 
mac 和 IOS 版实现
在 Mac 和 iOS 上,C 标准库的实现是 libSystem 的一部分,libSystem 是位于 /usr/lib/libSystem.dylib 中的核心库 。LibSystem 包含其他组件,如数学库、线程库和其他底层实用程序 。


推荐阅读