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