| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 9312 人关注过本帖, 1 人收藏
标题:长跳转的实现
取消只看楼主 加入收藏
neverTheSame
Rank: 3Rank: 3
来 自:江西农业大学
等 级:新手上路
威 望:9
帖 子:1511
专家分:0
注 册:2006-11-24
结帖率:100%
收藏(1)
 问题点数:0 回复次数:1 
长跳转的实现
*/ --------------------------------------------------------------------------------------
*/ 出自: 快乐编程 https://hi.bccn.net/108519
*/ 作者: neverTheSame E-mail:zhaoxufeng9997@ QQ:475818502
*/ 时间: 2008-6-1
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ --------------------------------------------------------------------------------------
 
长跳转的实现

你想知道goto语句都实现不了的跳转吗?
你想知道从一个函数跳转到另一个函数的内部的某个语句的原理吗?
你想知道怎么实现从一个函数跳转到另一个函数的内部的某个语句吗?

 

那么开始了解长跳转(long jump)吧。
长跳转(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


从上面的例子中,我们可以看出setjmp与longjmp的功能强大。

 

作者建议:长跳转是汇编语言到C语言的一种延续,但一般情况不要用这种方法。这会造成程序的阅读性与可理解性的灾难。

 

讲解长跳转的知识,只是让大家了解有这么一种方法,希望大家只作学术上的探讨,不要用之于实际工作中。
搜索更多相关主题的帖子: 语句 jump goto long 函数 
2008-06-25 01:14
neverTheSame
Rank: 3Rank: 3
来 自:江西农业大学
等 级:新手上路
威 望:9
帖 子:1511
专家分:0
注 册:2006-11-24
收藏
得分:0 
看看大家这样评价的作品,真是痛心疾首.
本来我的意思让大家多了解一些知识,
竟然在"原创"与"不是原创"来争论,
如果你觉得我所写的有什么不对,
你可以提啊.

再说,如果你早就知道这个知识,为什么不早点说出
来分享给大家呢?
而在我写出来的时侯,就说"我早就看..."呢?

我可以保证我的作品是原创,
我也没有什么马甲,
当然,如果你对作品有什么意见和建议可以说,
你说我的作品不是原创,
绝对不可以,
你这是对我的作品的污辱,

你给出有价值证据??....

wap酷禾网(http://wap.),提供免费的、优质的、快捷的wap资源下载服务。
2008-06-25 16:17
快速回复:长跳转的实现
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.011546 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved