posts - 134,comments - 22,trackbacks - 0
          在C語言中,用于跳轉(zhuǎn)的goto語句,只能夠用在同一個(gè)函數(shù)內(nèi)部的跳轉(zhuǎn)。而setjmp 與 longjmp的結(jié)合使用,卻可以實(shí)現(xiàn)在不同程序之間的跳轉(zhuǎn)。讓我們先來看一下函數(shù)原型吧:
          #include <setjmp.h>
          int setjmp(jmp_buf env
          Returns: 0 if called directly, nonzero if returning from a call to longjmp.

          void longjmp(jmp_buf env, int val);

              這兩個(gè)函數(shù)都要包含頭文件setjmp.h。而且它們?cè)谔幚沓霈F(xiàn)在深層函數(shù)嵌套的錯(cuò)誤情況時(shí)很有用處。
              setjmp這個(gè)函數(shù)很有意思,雖然是一個(gè)函數(shù),可是卻可以返回兩個(gè)不同的值。當(dāng)?shù)谝淮沃苯诱{(diào)用setjmp時(shí),返回值為0。當(dāng)從longjmp函數(shù)返回時(shí),setjmp函數(shù)的返回值為longjmp的第二個(gè)參數(shù)的值。
              那么在什么地方調(diào)用setjmp呢?我們希望當(dāng)從longjmp函數(shù)返回時(shí),程序從哪里接著開始運(yùn)行,我們就在哪里調(diào)用setjmp??磦€(gè)小實(shí)例,你就明白是怎么回事了。

              #include<stdio.h>
              #include<setjmp.h>

              jmp_buf ebuf;
              void f2(void);
             int main(void)
             {
               int i;
               printf("1");
               i=setjmp(ebuf);
               if(i==0)                                              //第一次執(zhí)行到這里時(shí),值為0,所以接下來執(zhí)行f2()
               {
             f2();
             printf("This will not be printed.");
               }
               printf("%d",i);                                    //由于從longjmp返回時(shí),i=3,不執(zhí)行if,所以執(zhí)行該行
               return 0;
          }
             void f2(void)
          {
             printf("2");                                         
             longjmp(ebuf,3);                     //longjmp函數(shù)返回,回到setjmp的位置,使得setjmp返回值為3
          }
              函數(shù)最后的執(zhí)行結(jié)果為123,嘻嘻。

                longjmp注意:
          1.不要假象寄存器類型的變量將總會(huì)保持不變。在調(diào)用longjmp之后,通過setjmp所返回的控制流中,例程中寄存器類型的變量將不會(huì)被恢復(fù)。
          2.不要使用longjmp函數(shù)來實(shí)現(xiàn)把控制流,從一個(gè)中斷處理例程中傳出,除非被捕獲的異常是一個(gè)浮點(diǎn)數(shù)異常。在后一種情況下,如果程序通過調(diào)用 _fpreset函數(shù),來首先初始化浮點(diǎn)數(shù)包后,它是可以通過longjmp來實(shí)現(xiàn)從中斷處理例程中返回。
          3. 在C++程序中,小心對(duì)setjmp和longjmp的使用,應(yīng)為setjmp和longjmp并不能很好地支持C++中面向?qū)ο蟮恼Z義。因此在C++程 序中,使用C++提供的異常處理機(jī)制將會(huì)更加安全。把setjmp和longjmp組合起來,原來它這么厲害!

          posted on 2010-08-06 13:29 何克勤 閱讀(630) 評(píng)論(0)  編輯  收藏 所屬分類: C/C++
          主站蜘蛛池模板: 乌兰察布市| 青海省| 屯昌县| 宿迁市| 当涂县| 东辽县| 精河县| 楚雄市| 闵行区| 石渠县| 神池县| 佳木斯市| 上栗县| 石城县| 茂名市| 凤山县| 尼勒克县| 临沭县| 固镇县| 常宁市| 宁阳县| 河间市| 林芝县| 南雄市| 额济纳旗| 兴和县| 梁平县| 益阳市| 阜新市| 贞丰县| 文登市| 万山特区| 嵊泗县| 高雄县| 德保县| 贵南县| 东乌珠穆沁旗| 汉源县| 易门县| 琼结县| 旅游|