C语言标准库
对于程序员来说,库是最重要的工具之一,可以避免重新造轮子。
课堂上助教给我们展示了:标准库中关于printf( )函数的部分,于是代码刷屏了好几秒 ( ⊙o⊙ )
我们来看下这个wiki词条
- 定义:所有目前符合标准的头文件(head file)的集合,以及常用的函数库实现程序→C标准函数库
- 标准函数库通常会随附在编译器上。因为 C 编译器常会提供一些额外的非 ANSI C函数功能,所以某个随附在特定编译器上的标准函数库,对其他不同的编译器来说,是不兼容的。
- 字符串输入函数gets()(以及 scanf() 读取字符串输入的使用上)是很多缓存溢出的原因,而且大多的程序设计指南会建议避免使用它。
- 至此,C标准函数库共有29个头文件。目前我用到的有:<stdio.h>,<math.h>,<complex.h>,<stdlib.h>,<time.h>
- 最常用的 stdio.h 头文件
- C语言为文件输入输出提供了许多标准库函数。这些库函数构成了C标准库头文件<stdio.h>的主体。
- 就像 printf() 函数的申明在头文件中,而函数的定义(实现)并不在里面
- 原来常量 EOF 和 NULL 都定义在这里,我最近才知道 NULL 相当于0,不是字符0,而是它的ASCII码值为0,并且与字符 ‘\0’ 是等价的
- 然后刚刚在ASCII码表上查不到 EOF 的值,它等于 -1。搜了一下又进入阮一峰的博客惹→EOF是什么
最后让我们看下<stdio.h>头文件吧~
- 头文件与源文件
既然函数的定义不在头文件中,那又在哪呢?又为什么要把函数的申明和定义分开?
除了以 .h 命名的头文件(header)以外,还有实现函数功能的源文件implementation(.c),函数的定义就在里面。这么做是基于 information hiding(encapsulation/封装)的原则。
过程是这样,计算机先把 .c 和 .h 文件编译成 .o 文件,再把他们链接在一起,成为一个二进制文件。
而库的编写者只需要把库文件(binary)和头文件(header)给想要用这个库的人就行了
C语言头文件和源文件分开有很多优点,也是有不断发展最后成这样的。有兴趣可以看下这些文章(其实我是自己还没看先记下来…fix me!)
- 如何使用C语言库
Step1:include the header files
如果库在 usr/include/ 目录下,那么就用 #include < *.h >
如果库在当前目录下,就用 #include “mylib.h”
Step2:link in the libraries
也就是把你的代码和编译后的二进制库文件链接起来,否则会出现 “Undefined symbols”
一般 gcc 会自动帮你链接,而简化你的编译操作。但有些情况你还是要自己链接,比如<math.h> 库 (貌似最新的 gcc 已经可以自动链接了?)
输入这一行命令链接即可$: gcc hello.c -l[lib]
(可以尝试写一个…fix me!)