<cstdlib>
包含标准 C 标准库标头 <stdlib.h>
并将关联名称添加到 std
命名空间。 包含此标头可确保使用 C 标准库标头中的外部链接声明的名称已在 std
命名空间中声明。
注意
<stdlib.h>
不包括类型 wchar_t
。
要求
标头:<cstdlib>
命名空间:std
命名空间和宏
namespace std {
using size_t = see definition;
using div_t = see definition;
using ldiv_t = see definition;
using lldiv_t = see definition;
}
#define NULL
#define EXIT_FAILURE
#define EXIT_SUCCESS
#define RAND_MAX
#define MB_CUR_MAX
仅阐释函数
extern "C" using c-atexit-handler = void();
extern "C++" using atexit-handler = void();
extern "C" using c-compare-pred = int(const void*, const void*);
extern "C++" using compare-pred = int(const void*, const void*);
开始和终止函数
Function | 说明 |
---|---|
_Exit |
在不使用析构函数或已注册函数的情况下终止程序。 |
abort |
在不使用析构函数的情况下终止程序。 |
atexit |
注册用于程序终止的函数。 |
exit |
销毁带有线程和静态存储的对象,然后返回控件。 |
at_quick_exit |
在没有程序终止参数的情况下注册函数。 |
quick_exit |
在有程序终止保留对象的情况下注册函数。 |
getenv |
查看 C 标准库参考。 |
system |
查看 C 标准库参考。 |
_Exit
[[noreturn]] void _Exit(int status) noexcept;
备注
程序终止时,没有对自动、线程或静态存储持续时间的对象执行析构函数,也没有调用传递给 atexit()
的函数。 函数 _Exit
是信号安全的。
abort
[[noreturn]] void abort() noexcept;
备注
程序终止时,没有对自动、线程或静态存储持续时间的对象执行析构函数,也没有调用传递给 atexit()
的函数。 函数 abort
是信号安全的。
at_quick_exit
int at_quick_exit(c-atexit-handler * func) noexcept;
int at_quick_exit(atexit-handler * func) noexcept;
返回值
如果注册成功,则为零;如果注册失败,则为非零。
备注
at_quick_exit()
函数注册了函数 func
,当 quick_exit()
被调用时,会在无参数的情况下对后者进行调用。 对 at_quick_exit()
的调用如果没有发生在对 quick_exit()
的所有调用之前,则可能不会成功。 函数 at_quick_exit()
没有引入数据争用。 如果从多个线程调用 at_quick_exit()
,则注册顺序可能不确定。 由于 at_quick_exit()
的注册与 atexit()
的注册不同,应用程序可能需要使用相同的参数调用这两个注册函数。 MSVC 支持至少注册 32 个函数。
atexit
int atexit(c-atexit-handler * func) noexcept;
int atexit(atexit-handler * func) noexcept;
注解
函数 atexit()
将 func
指向的函数注册为在正常程序终止时进行无参数调用。 对 atexit()
的调用如果没有发生在对 exit()
的调用之前,则可能不会成功。 函数 atexit()
没有引入数据争用。
返回值
如果注册成功,则返回零;如果注册失败,则返回非零。
exit
[[noreturn]] void exit(int status);
备注
首先,具有线程存储持续时间以及与当前线程关联的对象会被销毁。
其次,具有静态存储持续时间的对象会被销毁,通过调用 atexit()
注册的函数将被调用。 调用 exit()
时不会销毁自动对象。 如果控件离开由 exit()
调用的已注册函数,原因是该函数没有为引发的异常提供处理程序,就会调用 std::terminate()
。 每次注册函数时都会对其进行一次调用。 具有自动存储持续时间的对象全部在程序中进行销毁,该程序的 main
函数不包含自动对象,并执行对 exit()
的调用。 通过引发在 main
中捕获的异常,可以将控件直接转移到这样的 main
函数。
接下来,所有带有未写入缓冲数据的打开的 C 流(由 <cstdio>
中声明的函数签名协调)将刷新,所有打开的 C 流将关闭,通过调用 tmpfile()
创建的所有文件都被删除。
最后,控件返回到主机环境。 当 status
为零或 EXIT_SUCCESS
时,将返回一个实现定义的状态成功终止的形式。 MSVC 返回零值。 如果 status
是 EXIT_FAILURE
,则 MSVC 返回值 3。 否则,MSVC 返回 status
参数值。
getenv
char* getenv(const char* name);
quick_exit
[[noreturn]] void quick_exit(int status) noexcept;
备注
通常,通过调用 at_quick_exit()
注册的函数是按照其注册的相反顺序来调用的。 此顺序不适用于在已调用其他注册函数之后注册的函数。 调用 quick_exit()
时不会销毁任何对象。 如果控件离开由 quick_exit()
调用的已注册函数,原因是该函数没有为引发的异常提供处理程序,就会调用 std::terminate()
。 通过 at_quick_exit()
注册的函数是由调用 quick_exit()
的线程调用的,该线程可能与注册它的线程不同。 这意味着已注册函数不应依赖于具有线程存储持续时间的对象标识。 调用已注册函数后,quick_exit()
将调用 _Exit(status)
。 标准文件缓冲区不会刷新。 如果通过 at_quick_exit()
注册的函数是信号安全的,则函数 quick_exit()
也是信号安全的。
system
int system(const char* string);
内存分配函数
// void* aligned_alloc(size_t alignment, size_t size); // Unsupported in MSVC
void* calloc(size_t nmemb, size_t size);
void free(void* ptr);
void* malloc(size_t size);
void* realloc(void* ptr, size_t size);
注解
这些函数具有 C 标准库中指定的语义。 MSVC 不支持 aligned_alloc
函数。 C11 以与 free()
的 Microsoft 实现不兼容的方式指定了 aligned_alloc()
,即 free()
必须能够处理高度一致的分配。
数值字符串转换
double atof(const char* nptr);
int atoi(const char* nptr);
long int atol(const char* nptr);
long long int atoll(const char* nptr);
double strtod(const char* nptr, char** endptr);
float strtof(const char* nptr, char** endptr);
long double strtold(const char* nptr, char** endptr);
long int strtol(const char* nptr, char** endptr, int base);
long long int strtoll(const char* nptr, char** endptr, int base);
unsigned long int strtoul(const char* nptr, char** endptr, int base);
unsigned long long int strtoull(const char* nptr, char** endptr, int base);
备注
这些函数具有 C 标准库中指定的语义。
多字节/宽字符串和字符转换函数
int mblen(const char* s, size_t n);
int mbtowc(wchar_t* pwc, const char* s, size_t n);
int wctomb(char* s, wchar_t wchar);
size_t mbstowcs(wchar_t* pwcs, const char* s, size_t n);
size_t wcstombs(char* s, const wchar_t* pwcs, size_t n);
备注
这些函数具有 C 标准库中指定的语义。
算法函数
void* bsearch(const void* key, const void* base, size_t nmemb, size_t size, c-compare-pred * compar);
void* bsearch(const void* key, const void* base, size_t nmemb, size_t size, compare-pred * compar);
void qsort(void* base, size_t nmemb, size_t size, c-compare-pred * compar);
void qsort(void* base, size_t nmemb, size_t size, compare-pred * compar);
备注
这些函数具有 C 标准库中指定的语义。
低质量随机数生成函数
int rand();
void srand(unsigned int seed);
注解
这些函数具有 C 标准库中指定的语义。
绝对值
int abs(int j);
long int abs(long int j);
long long int abs(long long int j);
float abs(float j);
double abs(double j);
long double abs(long double j);
long int labs(long int j);
long long int llabs(long long int j);
备注
这些函数具有 C 标准库中指定的语义。
整数除法
div_t div(int numer, int denom);
ldiv_t div(long int numer, long int denom);
lldiv_t div(long long int numer, long long int denom);
ldiv_t ldiv(long int numer, long int denom);
lldiv_t lldiv(long long int numer, long long int denom);
注解
这些函数具有 C 标准库中指定的语义。