setjmp和longjmp的使用,
今天在程序里使用setjmp and longjmp进行跳转来进行错误处理,这让我想起了多年前在QBASIC里使用goto感觉,那种对程序的完全控制和自由,当然这种自由也是有代价的,那就是程序的可读性。
但在C语言里适当的使用,也是取代try..catch..的一种方法。
exmaple:
#include <setjmp.h>
jmp_buf g_jmpbuf;
void fun1()
{
printf( "In fun1./n");
longjmp( g_jmpbuf, TRUE);
}
int main()
{
if( setjmp(g_jmpbuf))
{
printf( "setjmp() return./n");
}else
{
printf( "call fun1./n");
fun1();
}
return 0;
}
从功能上我们可以看得出setjmp t和longjmp的原理,
当我们调用setjmp时,其实是将当前各个寄存器值保存到g_jmpbuf中,当调用longjmp时再时将g_jmpbuf中的状态恢复,同时将longjmp()中的第二个参数放入代码栈作为setjmp()的反回值。
但有一点是longjmp比不上QBASIC中的goto的,那就是只能是从被调用处跳到调用处, 返之则不行,因为那些被保存了的寄存器值也就无效了!
多么怀念我的QBASIC呀!