原帖及討論:http://bbs.bccn.net/thread-221066-1-1.html
*/ ————————————————————————————–
*/ 出自: 快樂編程 http://hi.bccn.net/108519
*/ 作者: neverTheSame E-mail:zhaoxufeng9997@126.com QQ:475818502
*/ 時(shí)間: 2008-6-1
*/ 聲明: 尊重作者勞動(dòng),轉(zhuǎn)載請(qǐng)保留本段文字
*/ ————————————————————————————–
長(zhǎng)跳轉(zhuǎn)的實(shí)現(xiàn)
你想知道goto語(yǔ)句都實(shí)現(xiàn)不了的跳轉(zhuǎn)嗎?
你想知道從一個(gè)函數(shù)跳轉(zhuǎn)到另一個(gè)函數(shù)的內(nèi)部的某個(gè)語(yǔ)句的原理嗎?
你想知道怎么實(shí)現(xiàn)從一個(gè)函數(shù)跳轉(zhuǎn)到另一個(gè)函數(shù)的內(nèi)部的某個(gè)語(yǔ)句嗎?
那么開始了解長(zhǎng)跳轉(zhuǎn)(long jump)吧。
長(zhǎng)跳轉(zhuǎn)(long jump)的原理是:設(shè)置一條語(yǔ)句的唯一標(biāo)識(shí)(setjmp(jmp_buf jmpb)),再通過長(zhǎng)跳轉(zhuǎn)(longjmp(jmp_buf jmpb, int retval))
轉(zhuǎn)到j(luò)mpb所標(biāo)識(shí)的語(yǔ)句。
先看一下setjmp和longjmp這兩個(gè)函數(shù)的用法吧。
函數(shù)名: setjmp
函數(shù)原型:int _Cdecl setjmp(jmp_buf jmpb);
作用: 設(shè)置非本地跳轉(zhuǎn)。即一個(gè)返回點(diǎn),當(dāng)程序調(diào)用longjmp函數(shù)(不論longjmp()和setjmp()是否在同一個(gè)函數(shù)或同一個(gè)作用域。)時(shí),
就可以返回到這個(gè)返回點(diǎn),繼續(xù)從這個(gè)點(diǎn)往下執(zhí)行。
形參: jmpb用來保護(hù)現(xiàn)場(chǎng)。
返回值: 首次調(diào)用返回0,當(dāng)longjmp()返回時(shí),調(diào)用返回值用longjmp()設(shè)定。
函數(shù)名: longjmp
函數(shù)原型:void _Cdecl longjmp(jmp_buf jmpb, int retval);
作用: 返回到setjmp()所設(shè)置的返回點(diǎn)。
形參: jmpb:用于恢復(fù)現(xiàn)場(chǎng)(由調(diào)用setjmp()時(shí)設(shè)置的)
retval:返回到setjmp()所在的位置時(shí),設(shè)置第二次setjmp()的返回值。
返回值: 無(wú)
再來看看它的使用例子吧。
#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: %dn”,
(value=setjmp(jumpPointer))); /*當(dāng)使用longjmp跳回來的時(shí)侯,
value為longjmp(jmp_buf jmpb, int retval)中的retval*/
if(value==0) /*setjmp最初調(diào)用的時(shí)侯返回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 longjmpfunn”);
longjmp(jumpPointer,10);
}
運(yùn)行結(jié)果:
Function “setjmp” return value: 0
Be about to call longjmp…
Be in longjmpfun
Function “setjmp” return value: 10
從上面的例子中,我們可以看出setjmp與longjmp的功能強(qiáng)大。
作者建議:長(zhǎng)跳轉(zhuǎn)是匯編語(yǔ)言到C語(yǔ)言的一種延續(xù),但一般情況不要用這種方法。這會(huì)造成程序的閱讀性與可理解性的災(zāi)難。
講解長(zhǎng)跳轉(zhuǎn)的知識(shí),只是讓大家了解有這么一種方法,希望大家只作學(xué)術(shù)上的探討,不要用之于實(shí)際工作中。