<menu id="w8yyk"><menu id="w8yyk"></menu></menu>
  • <dd id="w8yyk"><nav id="w8yyk"></nav></dd>
    <menu id="w8yyk"></menu>
    <menu id="w8yyk"><code id="w8yyk"></code></menu>
    <menu id="w8yyk"></menu>
    <xmp id="w8yyk">
    <xmp id="w8yyk"><nav id="w8yyk"></nav>
  • 網站首頁 > 物聯資訊 > 技術分享

    setjump 和 longjump

    2016-09-28 00:00:00 廣州睿豐德信息科技有限公司 閱讀
    睿豐德科技 專注RFID識別技術和條碼識別技術與管理軟件的集成項目。質量追溯系統、MES系統、金蝶與條碼系統對接、用友與條碼系統對接

    goto語句可以用于同一個函數內異常處理,不幸的是,goto是本地的,它只能跳到所在函數內部的標號上。為了解決這個限制,C函數庫提供了setjmp()和longjmp()函數,它們分別承擔非局部標號和goto作用。頭文件<setjmp.h>申明了這些函數及同時所需的jmp_buf數據類型。
        1.setjmp(jbuf)設置“jump”點,用正確的程序上下文填充jmp_buf對象jbuf。這個上下文包括程序存放位置、棧和框架指針,其它重要的寄存器和內存數據。當初始化完jump的上下文,setjmp()返回0值。
        2. 以后調用longjmp(jbuf,r)的效果就是一個非局部的goto或“長跳轉”到由jbuf描述的上下文處(也就是到那原來設置jbuf的setjmp()處)。當作為長跳轉的目標而被調用時,setjmp()返回r (或1,如果r設為0的話)。(setjmp()不能在這種情況時返回0,否則就和設置jump點的返回值沖突了)

    [cpp] view plaincopy  
    1. #include "apue.h"  
    2. #include <setjmp.h>  
    3.   
    4. #define TOK_ADD    5  
    5.   
    6. jmp_buf jmpbuffer;  
    7.   
    8. int  
    9. main(void)  
    10. {  
    11.      char    line[MAXLINE];  
    12.   
    13.      if (setjmp(jmpbuffer) != 0)  
    14.          printf("error");  
    15.      while (fgets(line, MAXLINE, stdin) != NULL)  
    16.         do_line(line);  
    17.      exit(0);  
    18. }  
    19.   
    20.  ...  
    21.   
    22. void  
    23. cmd_add(void)  
    24. {  
    25.     int     token;  
    26.   
    27.     token = get_token();  
    28.     if (token < 0)    /* an error has occurred */  
    29.         longjmp(jmpbuffer, 1);  
    30.     /* rest of processing for this command */  
    31. }  


    setjump和longjump返回時對auto變量、register變量、volatile變量和靜態變量的恢復情況示例。cc -O選項表示編譯優化。
    longjump返回時一般情況下不會恢復到setjump時的值,此種情況屬于未定義。
    如果你不想讓anto變量的值回滾,需要加上volatile屬性。

    [cpp] view plaincopy  
    1. #include "apue.h"  
    2. #include <setjmp.h>  
    3.   
    4. static void f1(int, int, int, int);  
    5. static void f2(void);  
    6.   
    7. static jmp_buf jmpbuffer;  
    8. static int     globval;  
    9.   
    10. int  
    11. main(void)  
    12. {  
    13.      int             autoval;  
    14.      register int    regival;  
    15.      volatile int    volaval;  
    16.      static int      statval;  
    17.   
    18.      globval = 1; autoval = 2; regival = 3; volaval = 4; statval = 5;  
    19.   
    20.      if (setjmp(jmpbuffer) != 0) {  
    21.          printf("after longjmp:\n");  
    22.          printf("globval = %d, autoval = %d, regival = %d,"  
    23.              " volaval = %d, statval = %d\n",  
    24.              globval, autoval, regival, volaval, statval);  
    25.          exit(0);  
    26.      }  
    27.   
    28.      /* 
    29.       * Change variables after setjmp, but before longjmp. 
    30.       */  
    31.      globval = 95; autoval = 96; regival = 97; volaval = 98;  
    32.      statval = 99;  
    33.   
    34.      f1(autoval, regival, volaval, statval); /* never returns */  
    35.      exit(0);  
    36. }  
    37.   
    38. static void  
    39. f1(int i, int j, int k, int l)  
    40. {  
    41.     printf("in f1():\n");  
    42.     printf("globval = %d, autoval = %d, regival = %d,"  
    43.         " volaval = %d, statval = %d\n", globval, i, j, k, l);  
    44.     f2();  
    45. }  
    46. static void  
    47. f2(void)  
    48. {  
    49.     longjmp(jmpbuffer, 1);  
    50. }  
    [cpp] view plaincopy  
      1. $ cc testjmp.c               compile without any optimization  
      2. $ ./a.out  
      3. in f1():  
      4. globval = 95, autoval = 96, regival = 97, volaval = 98, statval = 99  
      5. after longjmp:  
      6. globval = 95, autoval = 96, regival = 97, volaval = 98, statval = 99  
      7. $ cc -O testjmp.c            compile with full optimization  
      8. $ ./a.out  
      9. in f1():  
      10. globval = 95, autoval = 96, regival = 97, volaval = 98, statval = 99  
      11. after longjmp:  
      12. globval = 95, autoval = 2, regival = 3, volaval = 98, statval = 99  
    RFID管理系統集成商 RFID中間件 條碼系統中間層 物聯網軟件集成
    最近免费观看高清韩国日本大全