gpt4 book ai didi

我可以撤消或删除 atexit 命令吗?

转载 作者:太空狗 更新时间:2023-10-29 16:46:30 24 4
gpt4 key购买 nike

如果我将 atexit( fn ); 放在退出堆栈上,它将在程序退出时执行:从 main() 返回或通过 exit ()

我可以将它从堆栈中移除吗?

你问我为什么要这样做?

我正在使用 atexitsetjmplongjmp 试验简单的 try-catch 机制。如果我可以 undo-atexit(fn); 就完美了——即使它只适用于最后注册的函数。

编辑:

按照 monoceres 的建议制作我自己的堆栈...

堆栈目前仅适用于一个异常捕获器。

void (*_catchFn[10])()  = {0,0,0,0,0,0,0,0,0,0};

void _catch(){
if ( _catchFn[0] != 0 ){
(_catchFn[0])();
}
}

void _addCatch( void (*fn)() ){
_catchFn[0]=fn;
}

void _remCatch( void (*fn)() ){
_catchFn[0]=0;
}

void test(){
jmp_buf env;

void catch(){ // we get here after an exit with a registered catch
longjmp(env,1); // return to the line marked except...
// that first will get the value 1
}
int first = setjmp( env); // ** return here **
fprintf( stderr , "test: After setjmp. first=%d\n" , first );
if( first == 0 ){ // try this code
_addCatch(catch); // register the catch function to 'catch' the exit
fprintf( stderr , "test: Before CHECK\n" );
// CHECK something and something bad happens and it exits
exit(1); // like this
fprintf( stderr , "test: After CHECK - THIS SHOULD NEVER BE SEEN AFTER AN EXCEPTION.\n" );
}else{
fprintf( stderr , "test: After longjmp return. first=%d\n" , first );
}
_remCatch( catch);
fprintf( stderr , "test: IT WORKED!\n");
exit(1); // exit again to see if we are safe
}

int main(){
atexit( _catch ); // register my global exception stack
test();
}

最佳答案

为什么不构建您自己的从单个 atexit() 函数调用的堆栈?这样您就可以随心所欲地操纵堆栈。

关于我可以撤消或删除 atexit 命令吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2310673/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com