21 标准库

21.1 标准库的使用

标准头:依据C标准,一个“标准头”不需要一定是文件,有可能内置在编译器自身中。
标准库:C语言的标准库总共划分成15个部分,每个部分用一个头描述。
扩展:许多编译器会使用扩展后的库,这类库(头文件)通常提供一些针对特定情形或特定操作系统的函数(比如更多对屏幕或键盘操作的函数,用于支持图形或窗口界面的头等)

21.1.1 包含标准头的程序中使用的名字的一些限制

意义:虽然这些规则并不总是强制性的,但不遵守这些规则可能会导致程序的可移植性下降。

必需遵守

  • 宏的名字:不能再使用在头文件中定义过的宏的名字
  • 类型名(typedef):具有文件作用域的库名(包括类型名)不可以在文件层次重新定义

建议遵守(避开保留字)

  • _大写字母__开头的标识符
  • _开头的标识符(除非仅声明在函数内部)
  • 标准库中所有具备外部链接的标识符,特别是所有标准库中的函数

21.1.2 使用宏隐藏函数

说明:标准库中经常会为小的实际函数定义同名的宏函数,这是允许的,目的是提高程序的运行速度。
取消隐藏:如果需要尽量缩小可执行代码的大小,或者需要一个指向这个库函数的指针,可以使用undef取消相应的红定义即可。

1
2
3
# include <ctype.h>

# undef isprint // 即使isprint没定义过,也不会有负面影响

绕过宏调用:可以通过为函数名加圆括号来屏蔽个别宏调用

1
(isptint)(); // 预处理器无法分辨出带圆括号的宏,而编译器仍可认出isprint函数

21.2 标准库概述

概述 标准头(15个) 提供的功能 相关章节
诊断 assert.h 仅包含assert宏,检查程序的状态,一旦任何检查失败,程序终止 24.1
字符处理 ctype.h 包括用于字符分类及大小写转换的函数 23.4
错误 errno.h 提供了errno("errno number"),errno是一个左值,可以在调用特定苦函数后进行监测,来判断调用过程中是否有错误发生 24.2
浮点型的特点 float.h 提供了用于描述浮点型特点的宏,包括值的范围及精度 23.1
整型的大小 limits.h 提供了用于描述整数类型和字符类型的宏,包括它们的最大值和最小值 23.2
本地化 locale.h 与本地化相关的行为,包括小数点的字符、货币的格式、字符集一集日期和时间的显示 25.1
数学计算 math.h 大量用于数据计算的函数,大部分使用double类型的实参,并返回一个double类型的值 23.3
非本地条转 setjmp.h setjmp函数和longjmp函数^21-2-7 24.4
信号处理 signal.h 用于异常情况(信号)处理的函数,包括终端和运行时错误^21-2-8-signal 24.4
可变实际参数 stdarg.h 提供给函数可以处理不定个参数的的工具,就像printfscanf函数 26.1
常用定义 stddef.h 提供了经常使用的类型和宏的定义 21.3
输入/输出 stdio.h 提供了大量用于输入/输出的函数,包括对顺序读写和随机读写文件的操作 22.1
常用实用程序 stdlib.h 包含了大量无法华贵其它头的函数[^stdlib] 26.2
字符串处理 string.h 提供了用于进行字符串操作的函数,包括肤质、拼接、比较以及搜索 23.5
日期与时间 time.h 提供相应的函数来获取日期和时间、操作时间和以多种方式显示时间等。 26.3

21.3 :常用定义

说明:stddef.h提供了常用的类型和宏的定义,但没有声明任何函数。

21.3.1 定义的类型

类型 说明 原始类型
ptrdiff_t 当记性指针相减运算时,其结果的类型 整数类型
size_t 运算符sizeof的返回值类型 整数类型
wchar_t 一种足够大的、可以用于表示所有支持的地区的所有字符的类型 整数类型

21.3.2 定义的宏

说明
NULL 空指针
offsetof 计算结构的起点到指定成员间的字节数

啊。,>.u≥Á__说明:计算结构成员的偏移量(距结构起点的距离)
用途:对人和编译器都会返回正确的偏移量,使我们可以编写一致性更好的程序。
结构体成员的偏移量:一些编译器会在结构中留下一些空洞(无效字节),从而影响到offsetof产生的值。

@param {struct} 结构类型本身(不是实例)
@param {*} 结构的成员
@return {int} 结构的起点到指定成员的字节数

1
2
3
4
5
struct s {
char a;
int b[2];
float c;
};
1
2
3
4
offsetof(struct s, a); // 0,C语言确保结构的第一个成员的地址与结构自身地址相同

offsetof(struct s, b); // 1(或2)
offsetof(struct s, c); // 5(或6)

[^stdlib]: 包含在<stdlib.h>中的函数可以将字符串转换成数、产生随机值、执行内存管理任务、域操作系统通信、执行搜索与排序以及对多字节字符及字符串进行操作。