c语言提供了两个函数可以用来非local的跳转:
#include <setjmp.h> int setjmp(jmp_buf envbuf ); void longjmp(jmp_buf env, int val);
setjmp保存当前的系统堆栈到envbuf中,第一次调用返回0,以后当我们调用longjmp
时返回longjmp设置的val,但是不可以返回0(val设置为0,返回1).
longjmp恢复前线程最近一次调用setjmp保存的环境,回到该setjmp处继续执行。
例子:
#include <setjmp.h>
#include <stdio.h>
jmp_buf ebuf;
void f(void);
int main(void){
int i;
printf("1");
i = setjmp(ebuf);
if(i == 0){
f();
printf("This will not be printed.");
}
printf("%d",i);
return 0;
}
void f(void){
printf("2");
longjmp(ebuf,3);
}
结果输出:123
C语言非局部跳转
3370

被折叠的 条评论
为什么被折叠?



