什么是 C++ cstdlib?

C++ cstdlib – 概览_C++


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++ 中,相同项目将采用对应的 。此外,随着命名空间的出现,新编写的 C++ 库函数不再在全局、非限定命名空间中定义。相反,它们只在标准命名空间 std 中声明。

如今,C++ 使用 cstdlib 就意味着保证 <stdlib.h> 中所含的全部内容均已在 std 命名空间中声明。因此,开发人员想要使用标准库中的函数时,他们必须先进行声明。可以显式声明,或通过指令声明,例如:

C++ cstdlib – 概览_C++ cstdlib_02

图 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++ cstdlib – 概览_C++ cstdlib_03


图 2:C 标准库中的绝对值函数

C++ cstdlib 头文件中 abs() 的相关重写包括上述所有情况。内容

C++ cstdlib 头文件包括若干成员函数、数据类型和常数值。下表列出了按头文件定义的函数。

C++ cstdlib – 概览_C++ cstdlib_04

图 3:转换函数

C++ cstdlib – 概览_C++_05


图 4:随机数相关函数

C++ cstdlib – 概览_C++_06


内存分配	描述或示例
malloc	分配堆内存(指定整个块大小)
calloc	分配堆内存(指定大小和计数;初始化内存)
realloc	调整已分配的内存大小
free	取消分配内存

图 5:动态内存分配函数

搜索和排序	描述或示例
bsearch	对数组进行二进制搜索
qsort	采用 Quick Sort(快速排序)对数组进行排序


图 6:搜索和排序函数

数学函数	描述或示例
abs	计算整数的绝对值
labs	计算长整数的绝对值
div	除以整数得出商,返回余数结果
ldiv	除以长整数得出商,返回余数结果

图 7:数学函数

C++ cstdlib – 概览_C++ cstdlib_07


图 8:结合多字节和宽字符使用的函数

常数和宏
C++ 库中的 cstdlib 包含多种宏和常数,以便于 C++ 语言开发和代码库标准化。例如,主函数返回的常数值如下:

EXIT_SUCCESS

EXIT_SUCCESS 常数可用作主函数的返回值,将调用框架解释为成功执行。虽然数值 0 也表示程序成功执行,但 EXIT_SUCCESS 针对的是具体实施。

EXIT_FAILURE

EXIT_FAILURE 常数也可用作主函数的返回值。然而,它表示的是执行失败的调用框架,可能存在严重的操作系统级错误。

C++ cstdlib – 概览_C++ cstdlib_08


图 11:主函数返回所用宏示例

例如,C++ cstdlib 定义的常数
NULL 表示指针常数为空,
RAND_MAX 表示 rand 命令生成的最大可能值,
MB_CUR_MAX 表示当前 locale 多字节字符的最大字节数。

结论
C++ 通用标准库头文件,也称为 C++ cstdlib,定义了用于数据类型转换、伪随机数生成、内存分配、搜索、排序、数学和处理宽或多字节字符的核心函数集。它还包括各种常数值形式的有用宏。在许多情况下,C++ 程序员使用来自 cstdlib 的类型、函数或常数,而不必包含此头文件,因为它已经包含在程序员使用的其它头文件中。当原先包含的头文件被删除,某些常数无法识别时,如果不知道某些类型和实用程序来自何处,后续可能会产生麻烦的编译错误。在这种情况下,可能需要使用 cstlib 来节省时间。

点击下载:揭开C++的面纱, C++新特性洞察 白皮书- Incredibuild

C++ cstdlib – 概览_C++ cstdlib_09