11.2 C/C++(www.cppentry.com)运行库
11.2.1 C语言运行库
任何一个C程序,它的背后都有一套庞大的代码来进行支撑,以使得该程序能够正常运行。这套代码至少包括入口函数,及其所依赖的函数所构成的函数集合。当然,它还理应包括各种标准库函数的实现。
这样的一个代码集合称之为运行库(Runtime Library)。而C语言的运行库,即被称为C运行库(CRT)。
如果读者拥有Visual Studio,可以在VC/crt/src里找到一份C语言运行库的源代码。然而,由于此源代码过于庞大,仅仅.c文件就有近千个,并且和C++(www.cppentry.com)的STL代码一起毫无组织地堆放在一起,以至于实际上没有什么仔细阅读的可能性。同样,Linux下的libc源代码读起来也如同啃砖头。所幸的是,在本章的最后,我们会一起来实现一个简单的运行库,让大家更直观地了解它。
一个C语言运行库大致包含了如下功能:
启动与退出:包括入口函数及入口函数所依赖的其他函数等。
标准函数:由C语言标准规定的C语言标准库所拥有的函数实现。
I/O:I/O功能的封装和实现,参见上一节中I/O初始化部分。
堆:堆的封装和实现,参见上一节中堆初始化部分。
语言实现:语言中一些特殊功能的实现。
调试:实现调试功能的代码。
在这些运行库的组成成分中,C语言标准库占据了主要地位并且大有来头。C语言标准库是C语言标准化的基础函数库,我们平时使用的printf、exit等都是标准库中的一部分。标准库定义了C语言中普遍存在的函数集合,我们可以放心地使用标准库中规定的函数而不用担心在将代码移植到别的平台时对应的平台上不提供这个函数。在下一章节里,我们会介绍C语言标准库的函数集合,并对一些特殊的函数集合进行详细介绍。
标准库的历史
在计算机世界的历史中,C语言在AT&T的贝尔实验室诞生了。初生的C语言在功能上非常不完善,例如不提供I/O相关的函数。因此在C语言的发展过程中,C语言社区共同意识到建立一个基础函数库的必要性。与此同时,在20世纪70年代C语言变得非常流行时,许多大学、公司和组织都自发地编写自己的C语言变种和基础函数库,因此当到了80年代时,C语言已经出现了大量的变种和多种不同的基础函数库,这对代码迁移等方面造成了巨大的障碍,许多大学、公司和组织在共享代码时为了将代码在不同的C语言变种之间移植搞得焦头烂额,怨声载道。于是对此惨状忍无可忍的美国国家标准协会(American National Standards Institute, ANSI)在1983年成立了一个委员会,旨在对C语言进行标准化,此委员会所建立的C语言标准被称为ANSI C。第一个完整的C语言标准建立于1989年,此版本的C语言标准称为C89。在C89标准中,包含了C语言基础函数库,由C89指定的C语言基础函数库就称为ANSI C标准运行库(简称标准库)。其后在1995年C语言标准委员会对C89标准进行了一次修订,在此次修订中,ANSI C标准库得到了第一次扩充,头文件iso646.h、wchar.h和wctype.h加入了标准库的大家庭。在1999年,C99标准诞生,C语言标准库得到了进一步的扩充,头文件complex.h、fenv.h、inttypes.h、stdbool.h、stdint.h和tgmath.h进入标准库。自此,C语言标准库的面貌一直延续至今。
【责任编辑:
云霞 TEL:(010)68476606】