纷乱的C标准库澄清

背景

使用C语言标准库时,经常听到各种libc,glibc、uclib…,这些标准库到底是什么关系?

溯源

因为C语言是ANSI首先制定标准,所以ANSI C标准库应该是最原始的标准库。最初的ANSI C标准库,其实就是unix的libc,别忘了,最早产生C语言的原因是:Dennis Ritchie为了开发unix操作系统。

unix阵营

unix操作系统跟C标准库关系如此紧密,以至于离开C标准库,unix操作系统就不能单独存在。
libc,glibc,uclib, musl lib,bionic等 都是linux下的C标准库,都是基于POSIX标准。都是对系统调用的封装。

windows阵营

操作系统的另一大阵营,windows也封装了标准的C库函数,ucrt(Universal C Runtime )。例如:C:\Program Files (x86)\Windows Kits\10\Include\10.0.22000.0\ucrt,该目录下都是windows C库函数。但是windows操作系统本身和C库,联系不像unix操作系统那么紧密。

下面的内容选读,供参考:

lib原理及使用场景

lib,一般是library的简写,当然,C标准库,也是一种library。

ANSI C标准库并不是C语言的组成部分,而是为开发C程序方便提供的一些辅助函数,提供这些函数的原因有几个:

  • 你可以把它理解成接口,为了保护你编写的C程序具备可移植性。例如你在自己的程序中调用malloc即可,实际上malloc在unix和windows环境下,实现方式可能不一样,但是这些是C标准库帮你搞定差异实现的。这也是为什么我们在不同操作系统上需要安装不同的C标准库。
  • C标准库中的一些函数,可能是为了防止重复造轮子,提供了一些通用算法函数,例如strcat。一般标准库提供的这些函数实现,是考虑了性能,可靠性和可移植性等因素,并且久经考验,所以一般推荐优先使用标准库函数。

C标准库一般不是以源码的形式提供,而是以二进制方式提供。二进制库又分为两种形式:静态库和动态库。

  • 选用动态库:你需要在你运行的操作系统之上,先安装这个动态库,也就是我们平时说的运行环境。不知道你有没有这样的经历,我的程序在这台机器上运行的好好的,为什么移动到另外一台机器就不行了呢?这是因为,我们缺少了对应的动态库,为我们提供自己程序中函数(例如malloc)调用的实现。
  • 选用静态库:静态库是将库和你自己的程序绑定在一起的。这种情况可以在一定程度上减少可移植性的问题(一定程度减少但不是全部避免,因为静态库可能还依赖了其它的库)。静态库会带来一个问题,程序会变得很大,对存储空间的浪费比骄严重,可能程序启动时间也会变长一些。所以一般比较大的库,都是设计成动态库的。C标准库也不例外。

说到这里,大家已经感觉到对于库的使用,要设置很多运行环境,还是比较麻烦的。还好操作系统帮你安装了一套基础C标准库。这也是为什么,我们很多程序员感知不到对C标准库环境变量的设置。

其实不仅仅是C语言,其他很多语言也是有标准库的。可以做一些简单对比:

  • C标准库不是语言的一部分。我们可以对比java的标准库。java的标准库和语言本身是分不开的,也就说,没有了标准库java语言无法独立使用。
  • C标准库一般比较简单,轻巧。我们可以对比下C++的标准库,里面提供了vector这些容器类型及其操作方式,显然要比C标准库大很多。

标准库设计内容多少,是一个权衡问题。相比于C语言,C++标准库中提供的很多内容,让开发者更方便傻瓜式的使用,但是在一定程度上限制了软件设计的灵活性(例如,我们在使用C++的vector的时候,拿到一个iterator,总是担心他是不是空;如果我们换做使用C语言的数组,就能够直观的通过数组下标来判断,当前数组值是否有效)。抽象层次高了,一些细节被隐藏掉,很容易让开发者忽略,从而踩坑。现在有一些高级语言在致力于解决这些问题,例如java的gc垃圾回收机制,致力于让开发者不用再操心内存释放的问题。但是对运行性能带了一定副作用。rust试图在抽象能力和运行性能之间获得更好的权衡,我们拭目以待。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值