库和连接
从技术上讲,你可以用纯手工编码的方式实现实用并且功能强大的程序。当然这样的做法时相当罕见的,因为无论是c语言还是c++,都没有提供实现诸如I/O操作符、高级数学计算、字符处理等功能的关键字。因此,大部分程序都需要调用标准函数库里包含的相关函数。
大部分编译器都提供一个标准函数库用来完成常用的任务。c++规范也规定编译器必须实现的一些基本的函数功能。当然,各种编译器除此之外一定还会再提供更多的函数功能。比如说,标准函数库并没有提供绘图的函数功能,但是很多编译器提供了部分绘图函数。
c++标准库可以被分为两大部分,c++标准函数库和c++标准类库。其中标准函数库是从c语言中继承而来的。c++支持整个在C89中定义的函数库。因此,所有的c语言的标准函数可以在用c++编写程序时使用。作为对标准函数库的补充,c++也定义了一个标准类库,提供了面向对象的例程供程序员使用。c++还定义了标准模板库(STL)。STL为很多编程中的问题提供了解决框架。c++标准类库和标准模板库都将在本书的后续章节中讲述。在本书的第一部分,我们仅仅介绍标准函数库,因为c语言仅仅定义了这个库。
标准函数库中包含了程序员需要的大部分常用的功能函数。当在程序中调用一个函数的时候,编译器将会“记忆”这些函数名称,然后在编译之后的链接过程中,将与这些库函数名与对应的目标代码连接进程序中。这些目标代码存放在标准函数库中。这个过程被称为linking(连接)。有些编译器使用自己的连接器,另外一些则使用操作系统提供的标准连接器。
标准函数库中的函数是浮动格式的,也就是说在不同程序的机器代码中它们的内存地址并不是固定定义的,固定的仅仅是偏移量。当程序与这些库函数目标代码连接时,才会通过这些偏移量计算出实际的内存地址。这一过程的细节在有些手册和参考书中有详细的介绍。不过,我们目前并不需要关注更多的实际内存定位的过程。
标准函数库提供的一部分编程时需要用到的函数功能,就像盖房子时需要的砖瓦一样。而我们自己也可以手工书写自己的函数,并且在应用中重复使用。我们也可以把这些自己定义的函数加入某个库中。