26-使用库描述
16.9.2 使用库描述
篇幅有限,我们无法讨论完整的库。但是,可以看几个具有代表性的示例。首先,了解函数文档。
可以在多个地方找到函数文档。你所使用的系统可能有在线手册,集成开发环境通常都有在线帮助。C实现的供应商可能提供描述库函数的纸质版用户手册,或者把这些材料放在CD-ROM中或网上。有些出版社也出版C库函数的参考手册。这些材料中,有些是一般材料,有些则是针对特定实现的。本书附录B中提供了一个库函数的总结。
阅读文档的关键是看懂函数头。许多内容随时间变化而变化。下面是旧的UNIX文档中,关于 fread() 的描述:
#include <stdio.h>
fread(ptr, sizeof(*ptr), nitems, stream)
FILE *stream;
首先,给出了应该包含的文件,但是没有给出 fread() 、 ptr 、 sizeof( * ptr) 或 nitems 的类型。过去,默认类型都是 int ,但是从描述中可以看出 ptr 是一个指针(在早期的C中,指针被作为整数处理)。参数 stream 声明为指向 FILE 的指针。上面的函数声明中的第2个参数看上去像是 sizeof 运算符,而实际上这个参数的值应该是 ptr 所指向对象的大小。虽然用 sizeof 作为参数没什么问题,但是用 int 类型的值作为参数更符合语法。
后来,上面的描述变成了:
#include <stdio.h>
int fread(ptr, size, nitems, stream);
char *ptr;
int size, nitems;
FILE *stream;
现在,所有的类型都显式说明, ptr 作为指向 char 的指针。
ANSI C90标准提供了下面的描述:
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
首先,使用了新的函数原型格式。其次,改变了一些类型。 size_t 类型被定义为 sizeof 运算符的返回值类型——无符号整数类型,通常是 unsigned int 或 unsigned long 。 stddef.h 文件中包含了 size_t 类型的 typedef 或 #define 定义。其他文件(包括 stdio.h )通过包含 stddef.h 来包含这个定义。许多函数(包括 fread() )的实际参数中都要使用 sizeof 运算符,形式参数的 size_t 类型中正好匹配这种常见的情况。
另外,ANSI C把指向 void 的指针作为一种通用指针,用于指针指向不同类型的情况。例如, fread() 的第1个参数可能是指向一个 double 类型数组的指针,也可能是指向其他类型结构的指针。如果假设实际参数是一个指向内含20个 double 类型元素数组的指针,且形式参数是指向 void 的指针,那么编译器会选用合适的类型,不会出现类型冲突的问题。
C99/C11标准在以上的描述中加入了新的关键字 restrict :
#include <stdio.h>
size_t fread(void * restrict ptr, size_t size, size_t nmemb, FILE * restrict stream);
接下来,我们讨论一些特殊的函数。