#include<setjmp.h>
int setjmp(jmp_buf env);//设置跳转点,jmp_buf类型是一种特殊类型,是某种形式的数组,用来当从longjmp返//回时恢复栈状态的所有信息,因为需要在longjmp函数中使用env,所以应将其定义为全局变量。
//返回值:若直接调用返回0,若从longjmp中返回则为非零
void longjmp(jmp_buf env,int val); //实现跳转功能,跳转到设置的跳转点,val的值为setjmp的返回值。
goto语句对于跳出多层循环很有用,但是他只能在本个函数内跳转,不能跨越函数跳转,而函数setjmp和longjmp可以实现跨越函数的跳转,这在对处理发生在很深层嵌套函数调用中的出错情况非常有用。
当longjmp 返回main函数时,这些变量的值是否能恢复到以前调用setjmp时的值,或者这些变量的值保持为调用do_line时的值?回答是:看情况。大多数实现并不会回滚自动变量和寄存器的值,而所有标准称他们的值是不确定的,如果你有一个自动变量,而不想使其回滚,则可定义其具有volatile属性。声明为全局变量和静态变量的值在longjmp函数返回时不变。
例子:
执行结果:
但不进行任何优化编译则自动变量和寄存器值不会回滚,当进行优化编译,其值回滚。
参考资料:
[1] unix环境高级编程(三版) 179页