Chinaunix首页 | 论坛 | 博客
  • 博客访问: 336767
  • 博文数量: 105
  • 博客积分: 2730
  • 博客等级: 少校
  • 技术积分: 1110
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-20 12:09
文章分类

全部博文(105)

文章存档

2013年(3)

2012年(2)

2011年(36)

2010年(34)

2009年(6)

2008年(20)

2007年(4)

分类: C/C++

2010-10-04 16:07:02

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其实非常有门路了!你需要的就是包装,当然,很容易看上去很屎.
阅读(501) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~