函数
<cstdlib>

atexit

int atexit (void (*func)(void));
extern "C" int atexit (void (*func)(void));extern "C++" int atexit (void (*func)(void));
extern "C" int atexit (void (*func)(void)) noexcept;extern "C++" int atexit (void (*func)(void)) noexcept;
设置将在退出时执行的函数
当程序正常终止时,指向 func 的函数将在不带参数的情况下自动调用。

如果通过不同的调用指定了多个 atexit 函数,则它们将以相反的顺序执行,如同堆栈一样(即最后指定的函数是退出时第一个执行的函数)。

同一个函数可以被注册以在退出时执行多次。

如果在调用 exit 之后调用 atexit,则该调用可能成功也可能不成功,具体取决于特定的系统和库实现(未定义行为)。

如果通过 atexit 注册的函数在终止时被调用,并且它抛出了一个它没有处理程序捕获的异常,则会自动调用 terminate(C++)。

特定的库实现可能会对使用 atexit 注册的函数数量施加限制,但不能少于 32 个函数调用。

参数

函数
将被调用的函数。该函数应不返回值且不接受参数。

返回值

如果函数成功注册,则返回零值。
如果失败,则返回非零值。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* atexit example */
#include <stdio.h>      /* puts */
#include <stdlib.h>     /* atexit */

void fnExit1 (void)
{
  puts ("Exit function 1.");
}

void fnExit2 (void)
{
  puts ("Exit function 2.");
}

int main ()
{
  atexit (fnExit1);
  atexit (fnExit2);
  puts ("Main function.");
  return 0;
}

输出

Main function.
Exit function 2.
Exit function 1.


数据竞争

并发调用此函数不会引入数据竞争(C++):调用在进程级别得到适当的同步。

异常 (C++)

无异常保证:此函数从不抛出异常。

另见