《C编程.开始C》11.标准库

C标准库是一个标准化的集合头文件用来实现普通操作,如输入/输出和字符串处理和库例程。与其他语言(如COBOL,Fortran和PL / I)不同,C不包含用于这些任务的内置关键字,因此几乎所有C程序都依赖于标准库来运行。

历史

C编程语言以前没有提供任何基本功能,例如I / O操作。随着时间的推移,C的用户社区共享想法和实现以提供这些功能。这些想法变得很普遍,并最终在1989年被纳入标准化C编程语言的定义中。这些现在称为C标准库

Unix和C都是在20世纪60年代末和70年代初在AT&T的贝尔实验室创建的。在20世纪70年代,C编程语言变得越来越流行,许多大学和组织开始为自己的项目创建自己的语言变体。到20世纪80年代初,各种C实现之间的兼容性问题变得明显。1983年,美国国家标准协会(ANSI)成立了一个委员会,以建立C的标准规范,称为“ANSI C”。这项工作最终于1989年创建了所谓的C89标准。最终标准的一部分是一组称为ANSI C标准库的软件

后来的C标准修订版已经向库中添加了几个新的必需头文件。对这些新扩展的支持因实现而异。

标题<iso646.h><wchar.h><wctype.h>添加了Normative Addendum 1(以下简称NA1),这是1995年批准的C标准的补充。

标题<complex.h><fenv.h><inttypes.h><stdbool.h><stdint.h><tgmath.h>C99一起添加,C99的修订版已发布在1999年。

注意:
该C ++程序设计语言包括ANSI C 89标准库的功能,但取得了一些改进,例如,将所有的标识符到所述std命名空间和改变头文件的名称从<xxx.h>到<CXXX> (但是,C风格的名称仍然可用,但已弃用)。

设计

每个函数的声明都保存在头文件中,而函数的实际实现则分成库文件。标题的命名和范围已经很普遍,但图书馆的组织仍然是多样的。标准库通常随编译器一起提供。由于C编译器通常提供ANSI C中未指定的额外函数,因此具有特定编译器的标准库与其他编译器的标准库大多不兼容。


许多C标准库已经被证明是精心设计的。事后看来,有几个部分被视为错误。字符串输入函数gets()(以及scanf()用于读取字符串输入的用法)是许多缓冲区溢出的来源,并且大多数编程指南建议避免这种用法。另一个奇怪的是strtok(),一个被设计为原始词法分析器但是非常“脆弱”并且难以使用的功能。

ANSI标准

ANSI C标准库由24个C头文件组成,可以使用单个指令将其包含在程序员的项目中。每个头文件包含一个或多个函数声明,数据类型定义和宏。这些头文件的内容如下。

与其他一些语言(例如Java)相比,标准库是微不足道的。该库提供了一组基本的数学函数,字符串操作,类型转换以及基于文件和控制台的I / O. 它不包括一组标准的“容器类型”,如C ++标准模板库,更不用说完整的图形用户界面(GUI)工具包,网络工具以及Java作为标准提供的其他功能。小标准库的主要优点是提供有效的ANSI C环境比使用其他语言更容易,因此将C移植到新平台相对容易。

已经开发了许多其他库来提供与其标准库中的其他语言提供的功能相同的功能。例如,GNOME桌面环境项目开发了GTK +图形工具包和GLib,这是一个容器数据结构库,还有许多其他众所周知的例子。可用的各种库意味着一些优秀的工具包已经通过历史证明了自己。相当大的缺点是它们通常不能很好地协同工作,程序员通常熟悉不同的库集,并且可以在任何特定平台上使用不同的库集。

ANSI C库头文件

<assert.h> 2用于包含断言宏,用于帮助检测程序调试版本中的逻辑错误和其他类型的错误。
<complex.h>一组用于处理复数的函数。(C99新增功能)
<文件ctype.h>此头文件包含用于按字符类型对字符进行分类或以独立于使用的字符集(通常是ASCII或其扩展名之一,尽管使用EBCDIC的实现也已知)的方式在大写和小写之间进行转换的函数。
<errno.h>中用于测试库函数报告的错误代码。
<fenv.h>中用于控制浮点环境。(C99新增功能)
<float.h>中包含指定浮点库的特定于实现的属性的已定义常量,例如两个不同浮点数(_EPSILON)之间的最小差异,精度的最大位数(_DIG)以及可以是的数字范围代表(_MIN,_MAX)。
<inttypes.h>还用于整数类型之间的精确转换。(C99新增功能)
<iso646.h>用于ISO 646变体字符集的编程。(NA1的新功能)
<limits.h>中包含定义的常量,指定整数类型的特定于实现的属性,例如可以表示的数字范围(_MIN,_MAX)。
<locale.h文件>对于setlocale()和相关常量。这用于选择适当的区域设置。
<math.h>中用于计算常见的数学函数- 有关详细信息,请参阅进一步的数学C ++编程/代码/标准C库/数学
<SETJMP.H>setjmp和longjmp,用于非本地出口
<signal.h中>用于控制各种异常情况
<STDARG.H>用于访问传递给函数的不同数量的参数。
文件<stdbool.h>对于布尔数据类型。(C99新增功能)
<stdint.h>中用于定义各种整数类型。(C99新增功能)
<STDDEF.H>用于定义几个有用的类型和宏。
<stdio.h>中提供C语言的核心输入和输出功能。该文件包含古老的printf功能。
<stdlib.h>中用于执行各种操作,包括转换,伪随机数,内存分配,过程控制,环境,信令,搜索和排序。
<string.h>的用于操纵几种字符串。
<tgmath.h>对于类型通用数学函数。(C99新增功能)
<time.h>中用于在各种时间和日期格式之间进行转换
<wchar.h>中使用宽字符操纵宽流和多种字符串 – 支持一系列语言的关键。(NA1的新功能)
<wctype.h>用于分类宽字符。(NA1的新功能)

常用支持库

虽然没有标准化,但C程序可能依赖于包含编译器在运行时使用的代码的例程的运行时库。初始化操作系统进程的代码(例如,在调用之前)main()在给定供应商的编译器的C运行时库中实现。运行时库代码可能有助于其他语言功能实现,例如处理未捕获的异常或实现浮点代码。

C标准库仅记录了本文中提到的特定例程以及它们的行为方式。因为编译器实现可能依赖于这些额外的实现级函数,所以很可能特定于供应商的例程与C标准库一起打包在同一个模块中,因为任何构建的程序都可能需要它们。用他们的工具集。

虽然由于此包装经常与C标准库混淆,但C运行时库不是该语言的标准化部分,并且是特定于供应商的。

编译器内置函数

一些编译器(例如,GCC)提供C标准库中许多函数的内置版本; 也就是说,函数的实现被写入编译的目标文件中,程序调用内置版本而不是C库共享对象文件中的函数。这减少了函数调用开销,特别是如果函数调用被内联变量替换,并允许其他形式的优化(因为编译器知道内置变体的控制流特性),但在调试时可能会引起混淆(例如,内置版本不能替换为仪表变体)。

POSIX标准库

POSIX(以及单一Unix规范)指定了许多应该可以在C标准库中使用的例程; 这些通常与C标准库函数一起实现,具有不同程度的接近程度。例如,glibc在libc.so中实现了诸如fork之类的函数,但是在将NPTL合并到glibc之前,它构成了一个带有自己的链接器标志的独立库。通常,这个POSIX指定的函数将被视为库的一部分; 可以将C库本身标识为ANSI或ISO C库。

POSIX识别以下库:

C此选项应使POSIX.1-2008的系统接口卷中引用的所有接口可用,可能的例外是列在<aio.h>,<arpa / inet.h>,<complex.h>中的那些接口,<fenv.h>,<math.h>,<mqueue.h>,<netdb.h>,<net / if.h>,<netinet / in.h>,<pthread.h>,<sched。 h>,<semaphore.h>,<spawn.h>,<sys / socket.h>,pthread_kill()和pthread_sigmask()在<signal.h>,<trace.h>中,接口标记为<可选< sys / mman.h>,在<fcntl.h>中标记为ADV(顾问信息)的接口,以及在<time.h>中以前缀clock_或time_开头的接口。不需要此选项来搜索此库。
此选项应提供lex的C语言输出所需的所有接口,这些接口不能通过-lc选项提供。(flex程序,lex的克隆,使用fl而不是l。)
并行线程此选项将使<pthread.h>中引用的所有接口以及<signal.h>中引用的pthread_kill()和pthread_sigmask()都可用。如果没有此选项,实现可能会搜索此库。
此选项应使<math.h>,<complex.h>和<fenv.h>中引用的所有接口可用。如果没有此选项,实现可能会搜索此库。
RT此选项应提供<aio.h>,<mqueue.h>,<sched.h>,<semaphore.h>和<spawn.h>中引用的所有接口,<sys / mman中标记为可选的接口。 h>,在<fcntl.h>中标记为ADV(咨询信息)的接口,以及在<time.h>中以前缀clock_和time_开头的接口。如果没有此选项,实现可能会搜索此库。
跟踪此选项将使<trace.h>中引用的所有接口可用。如果没有此选项,实现可能会搜索此库。
XNET此选项应提供<arpa / inet.h>,<netdb.h>,<net / if.h>,<netinet / in.h>和<sys / socket.h>中引用的所有接口。如果没有此选项,实现可能会搜索此库。
ÿ此选项应提供yacc的C语言输出所需的所有接口,这些接口不能通过-lc选项提供。(某些yacc克隆,包括bison和byacc,在生成的文件中包含整个库,因此不必使用-l y。)

猜你想读:《C编程.开始C》12.演习

THE END
分享