[[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 标准库中指定的语义。
头文件引用
C++ 标准库概述
C++ 标准库中的线程安全