在前面的各章中我们已经见过C标准库的一些用法,总结如下:
在第 1 节 “数学函数”中用到了
math.h
中声明的sin
和log
函数,使用这些函数需要动态链接libm
共享库。在中用到了
stdlib.h
中声明的exit
函数,使用这个函数需要动态链接共享库。在第 6 节 “折半查找”中用到了
assert.h
中定义的assert
宏,在中我们看到了这个宏的一种实现,它的实现需要调用stdio.h
和stdlib.h
中声明的函数,所以使用这个宏也需要动态链接libc
共享库。在第 1 节 “本章的预备知识”中介绍了
stdlib.h
中声明的malloc
和free
函数以及string.h
中声明的strcpy
和strncpy
函数,使用这些函数需要动态链接libc
共享库。在中介绍了
stdarg.h
中定义的va_list
类型和、va_start
、va_end
等宏定义,并给出了一种实现,这些宏定义的实现并没有调用库函数,所以不依赖于某个共享库,这一点和assert
不同。
总结一下,Linux平台提供的C标准库包括:
一组库文件,提供了库函数的实现。大多数库函数在
libc
共享库中,有些库函数在另外的共享库中,例如数学函数在libm
中。在第 4 节 “共享库”讲过,通常libc
共享库是/lib/libc.so.6
,而我的系统启用了hwcap机制,libc
共享库是/lib/tls/i686/cmov/libc.so.6
。
本章介绍另外一些最基本和最常用的库函数(包括一些不属于C标准但在UNIX平台上很常用的函数),写这一章是为了介绍字符串操作和文件操作的基本概念,而不是为了写一本C标准库函数的参考手册,Man Page已经是一本很好的手册了,读者学完这一章之后在开发时应该查阅Man Page,而不是把我这一章当参考手册来翻,所以本章不会面面俱到介绍所有的库函数,对于本章讲到的函数有些也不会讲得很细,因为我假定读者经过上一章的学习再结合我讲过的基本概念已经能看懂相关的Man Page了。很多技术书的作者给自己的书太多定位,既想写成一本入门教程,又想写成一本参考手册,我觉得这样不好,读者过于依赖技术书就失去了看真正的手册的能力。