您的位置:首页 > 编程语言 > C语言/C++

基于C语言:长跳转的实现

2009-07-15 16:04 85 查看

基于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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: