setjmp & longjmp
这两个函数的作用是实现程序中任意位置的goto
setjmp调用的地方等于被标记了一个跳转label入口,之后使用longjmp跳转的时候会再进入setjmp这条语句.
longjmp的参数表示setjmp的返回值,第一次setjmp一定返回0,而从longjmp进入则返回非零.通过判断setjmp的返回值可以选择继续正常的控制流程或者进行longjmp需要的处理.
类比c++/java的try-catch,可以很大致了解为什么这样设计.c++/java的机制确实看起来更优美一些.更贴近字面的意思
try{
foo();
}catch(Exception type1){
bar1();
}catch(Exception type2){
bar2();
}
foo(){
do sth.... throw Exception type1?!
do sthelse.....throw Exception type2?!
return;
}
jmp_buf xxx_temp_label;
try == if((ret=setjmp(xxx_temp_label)) == 0)
catch(...1) == else if (ret == type1)
catch(...2) == else if (ret == type2)
throw x == longjmp(xxx_temp_label, x)
全都一一对应上了.这样,在C里实现trycatch其实非常有门路了!你需要的就是包装,当然,很容易看上去很屎.
阅读(537) | 评论(0) | 转发(0) |