setjmp和longjmp的用法

2021-07-03 21:26:16 字數 833 閱讀 9022

在c中,goto語句是不能跨越函式的,而執行這類跳轉功能的就是函式setjmp和longjmp,這兩個函式對於處理發生在深層巢狀函式呼叫中的出錯情況是非常有用的

#include

int  setjmp (jmp_buf  env);

setjmp() 函式是一次呼叫,2次返回,第一次呼叫時返回0,而在第二次返回時是longjmp()的呼叫時返回的,此時返回的值是longjmp裡設定的val值。

void  longjmp (jmp_buf  env, int val);

此函式一般設定在條件語句裡,條件一旦滿足就執行longjmp函式,而longjmp函式的執行結果就是實現遠端跳轉,它會跳轉到setjmp處,並且把jmp_buf  env = val,就是該函式同時把setjmp函式裡的env設定成val。從而實現遠端跳轉的功能。

執行結果:

遠端跳轉對於自動變數和暫存器變數的狀態是不確定的,不同的實現對於編譯優化與否有不同的結果,如果期望得到穩定的可移植行,最好不要使用自動變數和暫存器變數,而改為使用全域性、靜態或者volatile變數。

setjmp函式和longjmp函式

這兩個函式是為了解決深層次函式巢狀返回的問題。函式原型 include int setjmp jmp buf env 返回值 若直接呼叫則返回0,若從longjmp呼叫返回則返回非0值。void longjmp jmp buf env,int val 在希望返回的位置呼叫setjmp,引數env通常...

跳轉函式 setjmp 和 longjmp

setjmp 和 longjmp 是一對跳轉函式,也是神一樣的函式,這種函式比goto都強大,但功能跟goto差不多 既然,規範裡要求不能使用goto,所以setjmp 和 longjmp 這個也基本不用。當然,前提特殊情況下是可以的。例如特殊處理,實現自己的異常處理 關於 setjmp 和 lon...

setjmp和longjmp函式使用詳解

setjmp和longjmp函式使用詳解 wykwdy007的專欄 部落格頻道 csdn.net 非區域性跳轉語句 setjmp和longjmp函式。非區域性指的是,這不是由普通c語言goto,語句在乙個函式內實施的跳轉,而是在棧上跳過若干呼叫幀,返回到當前函式呼叫路徑上的某乙個函式中。includ...