什么是 C++ cstdlib?
C++ 标准库头文件 (cstdlib in C++) 是 C++ 程序员使用最广泛的库头文件。它定义了一系列函数和宏,以实现跨团队、跨平台的高效且具有卓越表现的标准化 C++ 代码。
C++ 是一种广受欢迎的程序语言,它能崛起的最初原因就是可以与 C 语言兼容。C 语言曾经是且现在仍然是一种流行、成熟的程序语言。兼容意味着程序员更容易适应这种语言,更重要的是,C++ 开发人员还可以利用现有的 C 语言代码。
程序员不需要从核心函数开始重建所有内容,可以在按合理步调转向 C++ 时,重复使用成熟的代码块。具体来讲,他们能够利用 C 语言标准库头文件 stdlib.h
目前,C++ cstdlib 是原始 <stdlib.h> 的 C++ 增强版。
C++ cstdlib 与 stdlib.h
C 标准库头文件 <stdlib.h> 为 C 语言程序员提供可靠、高效的函数,以实现动态内存分配、数据类型转换、伪随机数生成、过程控制、搜索和排序、数学以及多字节或宽字符函数。除了这些常见例程外,还包括一些常用常数,以促进组织和平台间的代码标准化。
头文件和命名空间
最初的 C++ 规范 C++98 中规定:为正确使用从 C 语言库中继承的函数功能,采用 <c –name–> 头文件。例如,传统 C 程序中可能包括 “string.h”,而在 C++ 中,相同项目将采用对应的 <cstring>。此外,随着命名空间的出现,新编写的 C++ 库函数不再在全局、非限定命名空间中定义。相反,它们只在标准命名空间 std 中声明。
如今,C++ 使用 cstdlib 就意味着保证 <stdlib.h> 中所含的全部内容均已在 std 命名空间中声明。因此,开发人员想要使用标准库中的函数时,他们必须先进行声明。可以显式声明,或通过指令声明,例如:
图 1:std::shared_ptr 用作双向链表的一部分
在左列中,由于没有在全局命名空间中声明,非限定使用 shared_ptr<> 报错。在中间列,命名空间显式声明,指向编译器可以查到的位置。在右列中,using namespace std 指令引导编译器至 std,搜索局部或全局范围内不存在的功能。注意:第三种(最右侧)方法不太好。还有一种方法是通过 std::shared_ptr 指令,仅添加 shared_ptr。
其它函数
C++ 库中的 cstdlib 包含由传统 C 语言函数、宏和数据类型构成的超集。以已声明的绝对值 (abs) 函数集为例。在 stdlib.h 中,C 语言定义了计算整数、长整数或长长整数值的绝对值 (abs) 所需的函数。但是没有获取单精度、双精度或更长双精度浮点数绝对值的函数。相反,这些类型需要在另一个常用 C 头文件 math.h 内声明。
绝对值数据类型 | 函数 | C 头文件 |
整数 | int abs(int x) | stdlib.h |
长整数 | long labs(long x) | stdlib.h |
长长整数 | long long llabs(long long x) | stdlib.h |
单精度浮点数 | float fabsf(float x) | math.h |
双精度浮点数 | double fabs(double x) | math.h |
更长双精度浮点数 | long double fabsl(long double x) | math.h |
图 2:C 标准库中的绝对值函数
C++ cstdlib 头文件中 abs() 的相关重写包括上述所有情况。
内容
C++ cstdlib 头文件包括若干成员函数、数据类型和常数值。下表列出了按头文件定义的函数。
转换函数 | 描述或示例 |
atof | 将一个字符串转换成一个双精度浮点数。注:返回结果不是浮点数。 |
atoi | 将一个字符串转换成一个整数。 |
atol | 将一个字符串转换成一个长整数。 |
下述函数是上述函数的更稳健替代 | |
strtod | 将一个字符串转换成一个双精度浮点数。 |
strtol | 将一个字符串转换成一个长整数。 |
stltoul | 将一个字符串转换成一个无符号的长整数。 |
strtoll | 将一个字符串转换成一个长长整数。 |
strtoull | 将一个字符串转换成一个无符号的长长整数。 |
图 3:转换函数
随机数 | 描述或示例 |
rand | 生成一个伪随机整数 |
random | 非标准 C 整数返回函数(由 POSIX 提供) |
srand | 设置随机数生成器的种子值 |
srandom | 设置随机数生成器的种子(非标准 C, POSIX) |
图 4:随机数相关函数
内存分配 | 描述或示例 |
malloc | 分配堆内存(指定整个块大小) |
calloc | 分配堆内存(指定大小和计数;初始化内存) |
realloc | 调整已分配的内存大小 |
free | 取消分配内存 |
图 5:动态内存分配函数
搜索和排序 | 描述或示例 |
bsearch | 对数组进行二进制搜索 |
qsort | 采用 Quick Sort(快速排序)对数组进行排序 |
图 6:搜索和排序函数
数学函数 | 描述或示例 |
abs | 计算整数的绝对值 |
labs | 计算长整数的绝对值 |
div | 除以整数得出商,返回余数结果 |
ldiv | 除以长整数得出商,返回余数结果 |
图 7:数学函数
多字节/宽字符函数 | 描述或示例 |
mblen | 返回多字节字符的大小 |
mbtowc | 将多字节字符转换为宽字符 |
wctomb | 将宽字符转换为多字节字符 |
mbstowcs | 将多字节字符序列转换为宽字符序列 |
wcstombs | 将宽字符序列转换为多字节字符序列 |
图 8:结合多字节和宽字符使用的函数
常数和宏
C++ 库中的 cstdlib 包含多种宏和常数,以便于 C++ 语言开发和代码库标准化。例如,主函数返回的常数值如下:
EXIT_SUCCESS
EXIT_SUCCESS 常数可用作主函数的返回值,将调用框架解释为成功执行。虽然数值 0 也表示程序成功执行,但 EXIT_SUCCESS 针对的是具体实施。
EXIT_FAILURE
EXIT_FAILURE 常数也可用作主函数的返回值。然而,它表示的是执行失败的调用框架,可能存在严重的操作系统级错误。
图 11:主函数返回所用宏示例
例如,C++ cstdlib 定义的常数 NULL 表示指针常数为空,RAND_MAX 表示 rand 命令生成的最大可能值,MB_CUR_MAX 表示当前 locale 多字节字符的最大字节数。
结论
C++ 通用标准库头文件,也称为 C++ cstdlib,定义了用于数据类型转换、伪随机数生成、内存分配、搜索、排序、数学和处理宽或多字节字符的核心函数集。它还包括各种常数值形式的有用宏。在许多情况下,C++ 程序员使用来自 cstdlib 的类型、函数或常数,而不必包含此头文件,因为它已经包含在程序员使用的其它头文件中。当原先包含的头文件被删除,某些常数无法识别时,如果不知道某些类型和实用程序来自何处,后续可能会产生麻烦的编译错误。在这种情况下,可能需要使用 cstlib 来节省时间。