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;
}
//--------------------------------------------------------------------------- |
兼容性:
相关链接:
• abort • atexit • atexit_t • exit • system
• abort_handler_s • ignore_handler_s • constraint_handler_t • set_constraint_handler_s
|
|
|
|