简介:
setjmp() 和longjmp()用来进行函数的跳转,并且可以跳回到原来的位置继续执行。当程序员希望在某个时刻,跳回到以前的一个位置执行的时候,setjmp() 和longjmp()就派上用场了。
函数声明:
在setjmp.h中,有如下声明:
int setjmp(jmp_buf env) ;void longjmp(jmp_buf env, intval) ;
int setjmp(jmp_buf env) ;
功能:保存程序中的当前位置;
参数:有一个参数env, 用来保存程序当前位置的堆栈环境;
返回值:返回int类型;
void longjmp(jmp_buf env, int val) ;
功能:能把控制转回到被保存的位置,即远程跳转;
参数:env:程序当前位置的堆栈环境;
val:用于设置setjmp() 的返回值
longjmp执行后跳转到保存env参数的setjmp()调用, 并由setjmp()调用返回, 就好像程序刚刚执行完setjmp()一样,此时setjmp()的返回值就是val。
返回值:返回void类型;
程序举例:
#include<stdio.h>
#include<setjmp.h>
#include<signal.h>
jmp_buf position;
void goback() {
printf("\nhello,\n");
longjmp(position,1);//跳回setjmp的调用处 - 使得setjmp返回值为1
}
void doWork(){
printf("\nworking begin\n");
goback();
printf("\nworking end\n"); //不会执行该语句,因为已经跳走了
}
int main() {
int res = setjmp(position);
if (!res) {
doWork(); // 进入此行前,setjmp返回0
}else { // 当longjmp跳转回,setjmp返回1,因此进入此行
printf("main\n"); // 打印
}
return 0;
}
运行结果:
/*
working begin
hello,
main
*/