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