2008年2月11日

setjmp/longjmp

春节在家没什么事情,于是拿出久未用过的C,自己折腾点小东西(以后做出来了再详细的写),顺便翻翻节前买的《C专家编程》
在讲堆栈的那章里,看见C标准库里的一对函数 setjmp/longjmp。突然发现自己对C,确实不够了解。

setjmp/longjmp 还有 sigsetjmp/siglongjmp 原理其实很简单,setjmp 保存一个栈顶指针,返回0,在longjmp调用时,回到setjmp的返回点,并且返回longjmp的第2个参数。

用法大概如下:

#include <stdio.h>
#include <setjmp.h>

jmp_buf buff;

void do_jump()
{
printf("do_jump\n");
longjmp(buff, 1);
}

int main()
{
switch(setjmp(buff))
{
case 0:
printf("start\n");
do_jump();
break;
case 1:
printf("end\n");
break;
}
}
输出
start
do_jump
end

在复杂的状态机中跳出,或者进行错误恢复,简单的代替C++的catch/throw 应该是不错的吧。

不过,这玩意儿,估计调试起来,比goto还麻烦,应该也是不常见人用的原因。

没有评论: