C++官网参考链接:https://cplusplus.com/reference/cstdlib/at_quick_exit/
函数
<cstdlib>
at_quick_exit
C11
int at_quick_exit (void (*func)(void));
C++11
extern "C" int at_quick_exit (void (*func)(void)) noexcept;
extern "C++" int at_quick_exit (void (*func)(void)) noexcept;
设置快速退出时执行的函数
func所指向的函数在调用quick_exit(不带实参)时自动调用。
如果对该函数的不同调用指定了多个at_quick_exit函数,则它们都将以相反的顺序执行。
如果在at_quick_exit中注册的函数在被quick_exit调用时抛出了一个异常,而它没有为该异常提供处理程序,则会自动调用terminate(C++)。
注意,函数的at_quick_exit堆栈与atexit堆栈是分开的(每个函数都由不同的环境触发),但是可以将相同的函数传递给两个函数,以便在两种情况下都调用它。
特定的库实现可能会对可以注册到at_quick_exit的函数数量施加限制,但这个限制不能少于32个函数。
形参
func
函数被调用。函数不返回任何值,也不接受任何实参。
返回值
如果函数成功注册,则返回0值。
如果失败,则返回非0值。
用例
/* at_quick_exit example */
#include <stdio.h> /* puts */
#include <stdlib.h> /* at_quick_exit, quick_exit, EXIT_SUCCESS */
void fnQExit (void)
{
puts ("Quick exit function.");
}
int main ()
{
at_quick_exit (fnQExit);
puts ("Main function: Beginning");
quick_exit (EXIT_SUCCESS);
puts ("Main function: End"); // never executed
return 0;
}
输出:
/* DEV-C++ ISO-C++11中没有at_quick_exit的定义,因此会出现编译错误 */
/* 官网参考答案:
Main function: Beginning Quick exit function. */
数据竞争
同时调用这个函数不会引入数据竞争:调用在进程级别是正确同步的,但是注意到从不同的线程调用的相对顺序是不确定的。
在调用quick_exit之前没有完成的at_quick_exit调用可能不会成功(取决于特定的库实现)。
异常(C++)
无抛出保证:此函数从不抛出异常。
另请参考
atexit Set function to be executed on exit (function)
quick_exit Terminate calling process quick (function)
abort Abort current process (function)