C 长跳转的实现

你想知道goto语句都实现不了的跳转吗?  
你想知道从一个函数跳转到另一个函数的内部的某个语句的原理吗?  
你想知道怎么实现从一个函数跳转到另一个函数的内部的某个语句吗?  
那么开始了解长跳转(longjump)吧。  
长跳转(longjump)的原理是:设置一条语句的唯一标识(setjmp(jmp_bufjmpb)),再通过长跳转(longjmp(jmp_bufjmpb,intretval))  
转到jmpb所标识的语句。  
先看一下setjmp和longjmp这两个函数的用法吧。  
函数名:setjmp  
函数原型:int_Cdeclsetjmp(jmp_bufjmpb);  
作用:设置非本地跳转。即一个返回点,当程序调用longjmp函数(不论longjmp()和setjmp()是否在同一个函数或同一个作用域。)时,  
就可以返回到这个返回点,继续从这个点往下执行。  
形参:jmpb用来保护现场。  
返回值:首次调用返回0,当longjmp()返回时,调用返回值用longjmp()设定。  
函数名:longjmp  
函数原型:void_Cdecllongjmp(jmp_bufjmpb,intretval);  
作用:返回到setjmp()所设置的返回点。  
形参:jmpb:用于恢复现场(由调用setjmp()时设置的)  
retval:返回到setjmp()所在的位置时,设置第二次setjmp()的返回值。  
返回值:无  
再来看看它的使用例子吧。  
#include<stdio.h>  
#include<conio.h>  
#include<setjmp.h>  
voidlongjmpfun(jmp_bufjumpPointer);  
intmain(void)  
{  
intvalue;  
jmp_bufjumpPointer;  
printf("Function\"setjmp\"returnvalue:%d\n",  
(value=setjmp(jumpPointer)));/*当使用longjmp跳回来的时侯,  
value为longjmp(jmp_bufjmpb,intretval)中的retval*/  
if(value==0)/*setjmp最初调用的时侯返回0*/  
{  
printf("Beabouttocalllongjmp...\n");  
longjmpfun(jumpPointer);  
}  
else  
{  
printf("Returnto\"setjmp\"function");  
}  
return0;  
}  
voidlongjmpfun(jmp_bufjumpPointer)  
{  
printf("Beinlongjmpfun\n");  
longjmp(jumpPointer,10);  
}  
运行结果:  
Function"setjmp"returnvalue:0  
Beabouttocalllongjmp...  
Beinlongjmpfun  
Function"setjmp"returnvalue:10  
从上面的例子中,我们可以看出setjmp与longjmp的功能强大。  
作者建议:长跳转是汇编语言到C语言的一种延续,但一般情况不要用这种方法。这会造成程序的阅读性与可理解性的灾难。  
讲解长跳转的知识,只是让大家了解有这么一种方法,希望大家只作学术上的探讨,不要用之于实际工作中。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值