<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 返回零值。 如果 statusEXIT_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 标准库中指定的语义。

另请参阅

头文件引用
C++ 标准库概述
C++ 标准库中的线程安全