主页C++ Builder 资料C++ Builder 参考手册cstdlib 标准库函数atexit
C++ Builder 串口控件
C++ Builder 编程技巧
C++ Builder 操作指南
C++ Builder 参考手册
基础知识
cfloat 浮点数
cmath 数学函数
cstdlib 标准库函数
 • atof, _ttof, _wtof
 • _atold, _ttold, _wtold
 • atoi, _ttoi, _wtoi
 • atol, _ttol, _wtol
 • _atoi64, _ttoi64, _wtoi64
 • strtod, _tcstod, wcstod
 • strtof, _tcstof, wcstof
 • strtold, _strtold, _tcstold, wcstold, _wcstold
 • strtol, _tcstol, wcstol
 • strtoll, _tcstoll, wcstoll
 • strtoul, _tcstoul, wcstoul
 • strtoull, _tcstoull, wcstoull
 • itoa, _itot, _itow
 • ltoa, _ltoa, _ltot, _ltow
 • ultoa, _ultot, _ultow
 • _i64toa, _i64tot, _i64tow
 • _ui64toa, _ui64tot, _ui64tow
 • ecvt, _ecvt
 • fcvt, _fcvt
 • gcvt, _gcvt
 • abs, labs, llabs
 • div, ldiv, lldiv
 • div_t, ldiv_t, lldiv_t
 • _rotl, _crotl, _lrotl
 • _rotr, _crotr, _lrotr
 • rand, _lrand
 • srand
 • random
 • randomize
 • mbstowcs
 • mblen
 • mbtowc
 • mbtowc_cp
 • wcstombs
 • wctomb
 • wctomb_cp
 • swab, _swab
 • _fullpath, _tfullpath, _wfullpath
 • _makepath, _tmakepath, _wmakepath
 • _splitpath, _tsplitpath, _wsplitpath
 • getenv, _tgetenv, _wgetenv
 • putenv, _putenv, _tputenv, _wputenv
 • _searchenv, _tsearchenv, _wsearchenv
 • _searchstr, _tsearchstr, _wsearchstr
 • system, _tsystem, _wsystem
 • abort
 • atexit
 • atexit_t
 • exit, _exit
 • abort_handler_s
 • ignore_handler_s
 • constraint_handler_t
 • set_constraint_handler_s
 • _argc
 • _argv, _targv, _wargv;
 • _environ, _tenviron, _wenviron
 • EXIT_SUCCESS, EXIT_FAILURE
 • _MAX_PATH, _MAX_DRIVE, _MAX_DIR, _MAX_FNAME, _MAX_EXT
 • MB_CUR_MAX
 • RAND_MAX, LRAND_MAX
System 字符串
System 日期和时间
System.Math.hpp 数学函数
其他数据类型
VCL 基础类
VCL 应用程序
Pictures 图片
Graphics 绘图
Additional 控件
System 控件
A ~ Z 字母顺序排列的目录
网友留言/技术支持
atexit - 注册程序结束时执行的函数

atexit:注册程序结束时执行的函数

 

函数原型:

int atexit(void (_USERENTRY *func)(void));

 

头文件:

#include <cstdlib>

 

命名空间:

std

 

参数:

func:指向 atexit_t 类型的函数指针,是没有参数、没有返回值的函数

 

返回值:

=0:成功
≠0:失败,注册超过 32 个函数了

程序最多可以注册 32 个在结束时执行的函数,先注册的后执行,后注册的先执行。

 

例1:注册控制台程序结束时执行的函数

通过这个例子可以看到,当 main 函数结束之后,开始执行 atexit 注册的函数,后注册的先执行,先注册的后执行

#pragma hdrstop
#pragma argsused

#ifdef _WIN32
#include <tchar.h>
#else
  typedef char _TCHAR;
  #define _tmain main
#endif

#include <cstdio>
#include <cstdlib>

using namespace std;

void _USERENTRY ExitFunc1(void)
{
  printf("ExitFunc1\n");
}

void _USERENTRY ExitFunc2(void)
{
  printf("ExitFunc2\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
  atexit(ExitFunc1);
  atexit(ExitFunc2);
  printf("_tmain\r\n");
  return 0;
}

 

例2:注册窗口程序结束时执行的函数,测试程序结束时执行的顺序

如果主窗口为 Form1,那么结束时按照以下顺序执行:
1. 首先执行 Form1 的 OnCloseQuery 事件
2. 然后执行 Form1 的 OnClose 事件
3. 接下来,主函数 _tWinMain 就结束了
4. 执行 atexit 注册的函数,后注册的先执行,先注册的后执行
5. 最后执行 Form1 的析构函数
测试程序如下:

Unit2.h
//---------------------------------------------------------------------------
#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
//---------------------------------------------------------------------------
namespace Victor {
//---------------------------------------------------------------------------
extern void ShowExitMessage(const wchar_t *s); // 加入和显示提示信息
extern void _USERENTRY ExitFunc1(void);        // 用 atexit 第一个注册的函数
extern void _USERENTRY ExitFunc2(void);        // 用 atexit 第二个注册的函数
//---------------------------------------------------------------------------
} // namespace Victor
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------

Unit2.cpp
//---------------------------------------------------------------------------
#pragma hdrstop
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
//---------------------------------------------------------------------------
namespace Victor {
//---------------------------------------------------------------------------
int iExitCount = 0;               // 用于统计加入的提示信息的个数
wchar_t wsExitMsg[256] = { 0 };   // 提示信息,不用字符串类的原因是程序结束时对象会被析构
//---------------------------------------------------------------------------
void ShowExitMessage(const wchar_t *s) // 加入和显示提示信息
{
  if(*s)
    wcscat(wsExitMsg, L"\r\n");
  wcscat(wsExitMsg, s);
  if(++iExitCount==6)             // 程序一共有六处加入了提示信息
    ::MessageBox(NULL, wsExitMsg, L"At Exit", MB_OK|MB_ICONINFORMATION);
}
//---------------------------------------------------------------------------
void _USERENTRY ExitFunc1(void) // 用 atexit 第一个注册的函数
{
  ShowExitMessage(L"Victor::ExitFunc1");
}
//---------------------------------------------------------------------------
void _USERENTRY ExitFunc2(void) // 用 atexit 第二个注册的函数
{
  ShowExitMessage(L"Victor::ExitFunc2");
}
//---------------------------------------------------------------------------
} // namespace Victor
//---------------------------------------------------------------------------

Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
  std::atexit(Victor::ExitFunc1); // 注册第一个退出时执行的函数
  std::atexit(Victor::ExitFunc2); // 注册第二个退出时执行的函数
}
//---------------------------------------------------------------------------
__fastcall TForm1::~TForm1()
{
  Victor::ShowExitMessage(L"TForm1::~TForm1"); // 主窗口的析构函数
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
  Victor::ShowExitMessage(L"TForm1::FormClose"); // 主窗口的 OnClose 事件
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
  Victor::ShowExitMessage(L"TForm1::FormCloseQuery"); // 主窗口的 OnCloseQuery 事件
}
//---------------------------------------------------------------------------

Project1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <tchar.h>
#include "Unit2.h"
//---------------------------------------------------------------------------
USEFORM("Unit1.cpp", Form1);
//---------------------------------------------------------------------------
int WINAPI _tWinMain(HINSTANCE, HINSTANCE, LPTSTR, int)
{
    try
    {
         Application->Initialize();
         Application->MainFormOnTaskBar = true;
         Application->CreateForm(__classid(TForm1), &Form1);
         Application->Run();
    }
    catch (Exception &exception)
    {
         Application->ShowException(&exception);
    }
    catch (...)
    {
         try
         {
             throw Exception("");
         }
         catch (Exception &exception)
         {
             Application->ShowException(&exception);
         }
    }

    Victor::ShowExitMessage(L"_tWinMain"); // 主函数 _tWinMain 结束
    return 0;
}
//---------------------------------------------------------------------------

 

兼容性:

函数 \ C++ Builder 编译器 bcc32 clang32 clang64
atexit

 

相关链接:

abortatexitatexit_texitsystem
abort_handler_signore_handler_sconstraint_handler_tset_constraint_handler_s

◤上一页:abort下一页:atexit_t

C++ 爱好者 -- Victor Chen 的个人网站 www.cppfans.com 辽ICP备11016859号