C和C++标准库,这是什么玩意?

简要介绍编写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的定义,程序启动时调用的函数 。
【C和C++标准库,这是什么玩意?】这是另外一个来自与同样标准的摘录,描述了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包含其他组件,如数学库、线程库和其他底层实用程序 。


推荐阅读