源文件通过编译可以生成目标文件(例如 GCC 下的 .o 和 Visual Studio 下的 .obj),并提供一个头文件向外暴露接口,除了保护版权,还可以将散乱的文件打包,便于发布和使用。
实际上我们一般不直接向用户提供目标文件,而是将多个相关的目标文件打包成一个静态链接库(Static Link Library),例如 Linux 下的 .a 和 Windows 下的 .lib。
打包静态库的过程很容易理解,就是将多个目标文件捆绑在一起形成一个新的文件,然后再加上一些索引,方便链接器找到,这和压缩文件的过程非常类似。
C语言在发布的时候已经将标准库打包到了静态库,并提供了相应的头文件,例如 stdio.h、stdlib.h、string.h 等。
Linux 一般将静态库和头文件放在/lib和/user/lib目录下,C语言标准库的名字是libc.a,大家可以通过locate命令来查找它的路径:
在 Windows 下,标准库由 IDE 携带,如果你使用的是 Visual Studio,那么在安装目录下的\VC\include文件夹中会看到很多头文件,包括我们常用的 stdio.h、stdlib.h 等;在\VC\lib文件夹中有很多 .lib 文件,这就是链接器要用到的静态库。
大家也可以在当前工程的属性面板(在工程名处单击鼠标右键选择“属性”)中查看路径:
ANSI C 标准共定义了 15 个头文件,称为“C标准库”,所有的编译器都必须支持,如何正确并熟练的使用这些标准库,可以反映出一个程序员的水平:
C语言共有两套标准,也就是 ANSI C 和 C99。ANSI C 是较早的标准,各种编译器都能很好的支持,C99 是后来的标准,编译器对它的支持不尽相同,请大家阅读《C语言的发展及其版本》了解更多细节。
除了C标准库,编译器一般也会附带自己的库,以增加功能,方便用户开发,争夺市场份额。这些库中的每一个函数都在对应的头文件中声明,可以通过 #include 预处理命令导入,编译时会被合并到当前文件。