预计阅读本页时间:-
最初并没有官方的C库,后来,基于UNIX的C实现变成了事实上的标准。于是ANSI C委员会主要以这个标准为基础开发出一个官方标准库。认识到C的应用范围不断扩展后,该委员会重新定义了这个库以使它可以在更广泛的系统上实现。
前面已经讨论了一些标准库中的I/O函数、字符函数和字符串函数。本章将介绍更多函数。不过,我们首先需要讨论如何使用库。
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
16.8.1 访问C库
如何访问C库依赖于实现,因此您需要明白应用于所用系统的更多的一般情况。首先,通常可以在多个不同位置找到库函数。例如,getchar()通常在stdio.h文件中作为宏进行定义,而strlen()通常保存在库文件中。第二,不同系统使用不同的方法搜索这些函数。下面的内容概述了三种可能性。
一、自动访问
在许多系统上,您只需编译程序,一些常见的库函数自动可用。
记住,应该声明所使用的函数的类型,通常包含适当的头文件即可做到这一点。描述库函数的用户手册指出了应该包含哪个文件。但是在一些旧的系统上,必须自己输入函数声明,函数类型仍是到用户手册中去查找。附录B按照头文件分组,总结了ANSI C库函数。
过去,不同实现使用的头文件名不一致。ANSI C标准把库函数分为多个系列,每个系列的函数原型都放在一个特定的头文件中。
二、文件包含
如果函数定义为宏,可使用#include指令来包含拥有该定义的文件。通常,类似的宏放在具有适当名字的头文件中。例如,许多系统(包括所有的ANSI C系统)都具有ctype.h文件,该文件包含一些确定字符性质(如大写、数字等等)的宏。
三、库包含
在程序编译或链接的某些阶段,您可能需要指定库选项。即使在自动检查标准库的系统上,也可能有不常使用的函数库。必须使用编译时选项来显式地指定这些库。注意要把这个过程与包含头文件区分开来。头文件提供函数声明或原型,而库选项告诉系统到哪儿寻找函数代码。显然,我们无法涉及所有系统的细节,但是这些讨论可以提醒您应该注意些什么。
16.8.2 参考库描述
限于篇幅,我们无法完整地讨论库,但是可以看几个代表性的示例。不过首先我们看一下有关库的文档。
可以在几个地方找到函数文档。您的系统可能有在线手册,而集成开发环境通常有在线帮助。C提供商可能提供描述库函数的用户指南书籍,也可能把这些材料放在参考用的CD-ROM上。有些出版社发行C库函数的参考手册。这些材料中,有些是一般性材料,有些则是面向特定实现的。前边已经说过,本书附录B中提供了一个小结。
阅读文档的关键技巧是解释函数头,许多内容随时间变化,下面是旧的UNIX文档中关于fread()的描述:
首先给出了适当的包含文件。没有给出fread()、ptr、sizeof(*ptr)和nitems的类型。过去,它们的默认类型为int。但是,从上下文可以看出ptr为指针(早期的C中,指针被作为整数处理)。参数stream声明为指向FILE的指针。这个函数声明看上去像是应该使用sizeof运算符作为第二个参数。实际上,这个参数的值应该是ptr指向的对象的大小。通常可以用sizeof作为参数,但是任何类型的整数值都合乎语法要求。
后来,形式变为:
现在明确给出了所有的类型,ptr作为指向char的指针。
ANSI C标准提供了下面的描述:
首先,使用了新的原型格式;其次,修改了一些类型。size_t类型定义为sizeof运算符返回的无符号整数类型,通常为unsigned int或unsigned long。stddef.h文件中包含有size_t类型的typedef或#define定义。其他文件(包括stdio.h)通过包含stddef.h来包含这个定义。包括fread()在内的许多函数经常把sizeof运算符作为实际参数的一部分。size_t类型使形式参数与这一常见用法相匹配。
另外,ANSI C使用指向void类型的指针作为通用指针。需要使用指向不同类型的指针时,可采用void指针。例如,fread()的第一个实际参数可能是指向double数组的指针,也可能是指向某种结构的指针。假设实际参数是一个指向由20个元素组成的double数组的指针,形式参数为void型指针,那么,编译器会选用适当的类型,而不会出现类型冲突。
最近,C99标准在描述中加入了新的关键字restric:
现在我们讨论一些特殊的函数。