當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > 關(guān)于linux中非局部跳轉(zhuǎn)的簡單使用
大家知道在C語言中有一個不是經(jīng)常使用的關(guān)鍵字,那就是goto。goto語句在編程的過程中如果濫用的話就會造成整個代碼邏輯容易混亂,大大降低了代碼的可讀性和可維護(hù)性。而且即使使用goto語句進(jìn)行跳轉(zhuǎn)也是有局限性的,那就是goto語句是一個實(shí)現(xiàn)局部跳轉(zhuǎn)的關(guān)鍵字,也就是只能在一個函數(shù)中進(jìn)行跳轉(zhuǎn),它是無法在不同的函數(shù)中實(shí)現(xiàn)跳轉(zhuǎn)的。那么如何實(shí)現(xiàn)在不同的函數(shù)中進(jìn)行非局部的跳轉(zhuǎn)呢?而setjmp和longjmp函數(shù)就可以幫助我們實(shí)現(xiàn)。
setjmp和longjmp函數(shù)是庫函數(shù),那么setjmp和longjmp如何使用呢?下邊咱們看一下函數(shù)接口。
int setjmp(jmp_buf env);
功能:就是確定longjmp的返回目標(biāo),我們可以通過返回值來確定setjmp函數(shù)的調(diào)用是第一次調(diào)用,還是longjmp返回。如果返回值是0,那么表示是設(shè)置longjmp的返回位置,否則表示是從longjmp中返回。
void longjmp(jmp_buf env, int val);
功能:執(zhí)行跳轉(zhuǎn),其中參數(shù)env就是setjmp函數(shù)設(shè)置后的env,參數(shù)val就是返回到setjmp位置之后setjmp的返回值。
示例代碼如下:
#include
#include
jmp_buf env;
void fun(void)
{
puts("in the fun");
longjmp(env, 1);
}
int main(int argc, char *argv[])
{
switch (setjmp(env))
{
case 0:
puts("setjmp first ..");
break;
case 1:
puts("return from fun ..");
break;
}
fun();
return 0;
}
雖然使用setjmp和longjmp函數(shù)的組合可以實(shí)現(xiàn)非局部的跳轉(zhuǎn),但是在使用時也需要謹(jǐn)慎。比如下邊的例子:
void fun_1(void)
{
….
setjmp(env);
….
return;
}
void fun_2(void)
{
….
Longjmp(env, 1);
…
}
該代碼實(shí)現(xiàn)了從fun_2函數(shù)中跳回到fun_1函數(shù)中,但是如果在執(zhí)行l(wèi)ongjump函數(shù)時fun_1函數(shù)已經(jīng)返回,那么就longjmp的返回就會出錯,因?yàn)閒un_1函數(shù)調(diào)用完畢之后棧幀就會被其他函數(shù)使用,那么longjmp就不可能返回了, 因此在使用它們進(jìn)行跳轉(zhuǎn)時要謹(jǐn)慎操作。