• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            大龍的博客

            常用鏈接

            統(tǒng)計(jì)

            最新評(píng)論

            setjmp

              與刺激的abort()和exit()相比,goto語(yǔ)句看起來(lái)是處理異常的更可行方案。不幸的是,goto是本地的:它只能跳到所在函數(shù)內(nèi)部的標(biāo)號(hào)上,而不能將控制權(quán)轉(zhuǎn)移到所在程序的任意地點(diǎn)(當(dāng)然,除非你的所有代碼都在main體中)。
              為了解決這個(gè)限制,C函數(shù)庫(kù)提供了setjmp()和longjmp()函數(shù),它們分別承擔(dān)非局部標(biāo)號(hào)和goto作用。頭文件<setjmp.h>申明了這些函數(shù)及同時(shí)所需的jmp_buf數(shù)據(jù)類型。
              原理非常簡(jiǎn)單:
              1.setjmp(j)設(shè)置“jump”點(diǎn),用正確的程序上下文填充jmp_buf對(duì)象j。這個(gè)上下文包括程序存放位置、棧和框架指針,其它重要的寄存器和內(nèi)存數(shù)據(jù)。當(dāng)初始化完jump的上下文,setjmp()返回0值。
              2. 以后調(diào)用longjmp(j,r)的效果就是一個(gè)非局部的goto或“長(zhǎng)跳轉(zhuǎn)”到由j描述的上下文處(也就是到那原來(lái)設(shè)置j的setjmp()處)。當(dāng)作為長(zhǎng)跳轉(zhuǎn)的目標(biāo)而被調(diào)用時(shí),setjmp()返回r或1(如果r設(shè)為0的話)。(記住,setjmp()不能在這種情況時(shí)返回0。)
              通過(guò)有兩類返回值,setjmp()讓你知道它正在被怎么使用。當(dāng)設(shè)置j時(shí),setjmp()如你期望地執(zhí)行;但當(dāng)作為長(zhǎng)跳轉(zhuǎn)的目標(biāo)時(shí),setjmp()就從外面“喚醒”它的上下文。你可以用longjmp()來(lái)終止異常,用setjmp()標(biāo)記相應(yīng)的異常處理程序。
              #include <setjmp.h>
              #include <stdio.h>
              jmp_buf j;
              void raise_exception(void)
              {
              printf("exception raised\n");
              longjmp(j, 1); /* jump to exception handler */
              printf("this line should never appear\n");
              }
              int main(void)
              {
              if(setjmp(j) == 0)
              {
              printf("''setjmp'' is initializing ''j''\n");
              raise_exception();
              printf("this line should never appear\n");
              }
              else
              {
              printf("''setjmp'' was just jumped into\n");
              /* this code is the exception handler */
              }
              return 0;
              }
              /* When run yields:
              ''setjmp'' is initializing ''j''
              exception raised
              ''setjmp'' was just jumped into
              */
              那個(gè)填充jmp_buf的函數(shù)不在調(diào)用longjmp()之前返回。否則,存儲(chǔ)在jmp_buf中的上下文就有問(wèn)題了:
              jmp_buf j;
              void f(void)
              {
              setjmp(j);
              }
              int main(void)
              {
              f();
              longjmp(j, 1); /* logic error */
              return 0;
              }
              所以,你必須把setjmp()處理成只是到其所在位置的一個(gè)非局部跳轉(zhuǎn)。
              Longjmp()和setjmp()聯(lián)合體運(yùn)行于異常生命期的2和3階段。longjmp(j,r)產(chǎn)生異常對(duì)象r(一個(gè)整數(shù)),并且作為返回值傳送到setjmp(j)處。實(shí)際上,setjmp()函數(shù)通報(bào)了異常r。
              下面這個(gè)例子采用switch,能更好的展現(xiàn)這對(duì)函數(shù)的功能:
              #include <setjmp.h>
              #include <stdio.h>
              jmp_buf j;
              void raise_exception(void)
              {
              printf("exception raised\n");
              longjmp(j, 3); /* jump to exception handler case 3 */
              printf("this line should never appear\n");
              }
              int main(void)
              {
              switch (setjmp(j))
              {
              case 0:
              printf("''setjmp'' is initializing ''j''\n");
              raise_exception();
              printf("this line should never appear\n");
              case 1:
              printf("Case 1\n");break;
              case 2:
              printf("Case 2\n");break;
              case 3:
              printf("Case 3\n");break;
              default:
              break;
              }
              return 0;
              }

            posted on 2010-12-31 10:45 大龍 閱讀(282) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            久久久久久久91精品免费观看| 国产精品久久久福利| 99精品久久久久久久婷婷| 亚洲精品无码专区久久久| 青青草原1769久久免费播放| 久久成人国产精品一区二区| 久久久精品人妻一区二区三区四 | 精品久久久久久| 色青青草原桃花久久综合| 久久婷婷久久一区二区三区| 婷婷久久五月天| 久久久久亚洲AV综合波多野结衣 | 日日狠狠久久偷偷色综合免费| 国产精品久久久天天影视| 久久夜色撩人精品国产小说| 久久久久亚洲AV片无码下载蜜桃| 亚洲日韩欧美一区久久久久我 | 久久狠狠爱亚洲综合影院| 久久精品国产第一区二区| aaa级精品久久久国产片| 一本久久a久久精品vr综合| 亚洲精品97久久中文字幕无码| 国产成人香蕉久久久久| 国产精品久久亚洲不卡动漫| 久久天天躁狠狠躁夜夜avapp| 久久天天婷婷五月俺也去| 久久亚洲精品无码观看不卡| 国产L精品国产亚洲区久久| 国产精品久久一区二区三区| 亚洲人成网亚洲欧洲无码久久| 超级97碰碰碰碰久久久久最新| 无码任你躁久久久久久老妇| 亚洲欧美久久久久9999| 色综合久久88色综合天天 | 久久综合五月丁香久久激情| 亚洲欧洲久久久精品| 无码国内精品久久综合88| 99蜜桃臀久久久欧美精品网站| 久久精品日日躁夜夜躁欧美| 无码AV中文字幕久久专区| 久久综合亚洲鲁鲁五月天|