基于C语言:长跳转的实现
在网络上看到的别人写的文章,觉得解析得不错,就贴过来了! 长跳转(long jump)的原理是:设置一条语句的唯一标识(setjmp(jmp_buf jmpb)),再通过长跳转(longjmp(jmp_buf jmpb, int retval)) 转到jmpb所标识的语句。
先看一下setjmp和longjmp这两个函数的用法吧。 函数名: setjmp 函数原型:int _Cdecl setjmp(jmp_buf jmpb); 作用: 设置非本地跳转。即一个返回点,当程序调用longjmp函数(不论longjmp()和setjmp()是否在同一个函数或同一个作用域。)时, 就可以返回到这个返回点,继续从这个点往下执行。 形参: jmpb用来保护现场。 返回值: 首次调用返回0,当longjmp()返回时,调用返回值用longjmp()设定。
函数名: longjmp 函数原型:void _Cdecl longjmp(jmp_buf jmpb, int retval); 作用: 返回到setjmp()所设置的返回点。 形参: jmpb:用于恢复现场(由调用setjmp()时设置的) retval:返回到setjmp()所在的位置时,设置第二次setjmp()的返回值。 返回值: 无
再来看看它的使用例子吧。 #include<stdio.h> #include<conio.h> #include<setjmp.h>
void longjmpfun(jmp_buf jumpPointer); int main(void) { int value; jmp_buf jumpPointer;
printf("Function /"setjmp/" return value: %d/n", (value=setjmp(jumpPointer))); /*当使用longjmp跳回来的时侯, value为longjmp(jmp_buf jmpb, int retval)中的retval*/
if(value==0) /*setjmp最初调用的时侯返回0*/ { printf("Be about to call longjmp.../n"); longjmpfun(jumpPointer); } else { printf("Return to /"setjmp/" function"); }
return 0; }
void longjmpfun(jmp_buf jumpPointer) { printf("Be in longjmpfun/n"); longjmp(jumpPointer,10); }
运行结果: Function "setjmp" return value: 0 Be about to call longjmp... Be in longjmpfun Function "setjmp" return value: 10
|
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理