longjmp

基本介紹

  • 中文名:longjmp
  • 類型:計算機語句
  • 隸屬:C函式館
  • 作用:配合setjmp使用
與刺激的abort()和exit()相比,goto語句看起來是處理異常的更可行方案。不幸的是,goto是本地的:它只能跳到所在函式內部的標號上,而不能將控制權轉移到所在程式的任意地點(當然,除非你的所有代碼都在main體中)。
為了解決這個限制,C函式館提供了setjmp()和longjmp()函式,它們分別承擔非局部標號和goto作用。頭檔案<setjmp.h>申明了這些函式及同時所需的jmp_buf數據類型
原理非常簡單:
1.setjmp(j)設定“jump”點,用正確的程式上下文填充jmp_buf對象j。這個上下文包括程式存放位置、棧和框架指針,其它重要的暫存器和記憶體數據。當初始化完jump的上下文,setjmp()返回0值。
2. 以後調用longjmp(j,r)的效果就是一個非局部的goto或“長跳轉”到由j描述的上下文處(也就是到那原來設定j的setjmp()處)。當作為長跳轉的目標而被調用時,setjmp()返回r或1(如果r設為0的話)。(記住,setjmp()不能在這種情況時返回0。)
通過有兩類返回值,setjmp()讓你知道它正在被怎么使用。當設定j時,setjmp()如你期望地執行;但當作為長跳轉的目標時,setjmp()就從外面“喚醒”它的上下文。你可以用longjmp()來終止異常,用setjmp()標記相應的異常處理程式。
《上文摘自 setjmp 中文百科 2015-02-02》
==================================================================================
==================================================================================
#include <stdio.h>#include <setjmp.h>jmp_buf j;void test_longjmp(){    longjmp(j, 1);        printf("1");}int main(){    if(setjmp(j))        {         printf("2");       }else{        test_longjmp();      }              printf("3");    //正確輸出:23    return 0;}

相關詞條

熱門詞條

聯絡我們