#include <setjmp.h>
#include <stdio.h>
jmp_buf b;
void f()
{
longjmp(b,1);
}
int main()
{
if (setjmp(b))
{
printf("world!/n");
}
else
{
printf("hello ");
f();
}
}
使用非局部跳转,可以实现从一个函数体内向另一个事先登记过的函数体内跳转,而不用担心堆栈混乱。上面代码的输出是 hello world1
当setjmp正常返回的时候,会返回0;而longjmp的作用,就是让程序的执行溜回到当初setjmp返回的时刻,并且返回由longjmp制定的返回值,即1,longjmp的参数2.longjmp会让程序“时光倒流”,并改变其行为,一直改变未来。
-----《程序员的自我修养-链接、装载与库》