C++ cstdlib – 概览

Blog
Author:
Dori ExtermanDori Exterman
Published On:
9月 14, 2021
Estimated reading time:
1 minute

什么是 C++ cstdlib

 cstdlib-example

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 命名空间中声明。因此,开发人员想要使用标准库中的函数时,他们必须先进行声明。可以显式声明,或通过指令声明,例如:

Example-of-using-std-shared_ptr

图 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 常数也可用作主函数的返回值。然而,它表示的是执行失败的调用框架,可能存在严重的操作系统级错误。

 Examples-of-macros-used-to-return-from-the-main-function.

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

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

结论

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

Whitepaper download