setjmp函數功能簡介

來源:互聯網
上載者:User
setjmp  與刺激的abort()和exit()相比,goto語句看起來是處理異常的更可行方案。不幸的是,goto是本地的:它只能跳到所在函數內部的標號上,而不能將控制權轉移到所在程式的任意地點(當然,除非你的所有代碼都在main體中)。
  為瞭解決這個限制,C函數庫提供了setjmp()和longjmp()函數,它們分別承擔非局部標號和goto作用。標頭檔<setjmp.h>申明了這些函數及同時所需的jmp_buf資料類型。
  原理非常簡單:
  l setjmp(j)設定“jump”點,用正確的程式上下文填充jmp_buf對象j。這個上下文包括程式存放位置、棧和架構指標,其它重要的寄存器和記憶體資料。當初始化完jump的上下文,setjmp()返回0值。
  l 以後調用longjmp(j,r)的效果就是一個非局部的goto或“長跳轉”到由j描述的上下文處(也就是到那原來設定j的setjmp()處)。當作為長跳轉的目標而被調用時,setjmp()返回r或1(如果r設為0的話)。(記住,setjmp()不能在這種情況時返回0。)
  通過有兩類傳回值,setjmp()讓你知道它正在被怎麼使用。當設定j時,setjmp()如你期望地執行;但當作為長跳轉的目標時,setjmp()就從外面“喚醒”它的上下文。你可以用longjmp()來終止異常,用setjmp()標記相應的例外處理常式。
  #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
  */
  那個填充jmp_buf的函數不在調用longjmp()之前返回。否則,儲存在jmp_buf中的上下文就有問題了:
  jmp_buf j;
  void f(void)
  {
  setjmp(j);
  }
  int main(void)
  {
  f();
  longjmp(j, 1); /* logic error */
  return 0;
  }
  所以,你必須把setjmp()處理成只是到其所在位置的一個非局部跳轉。
  Longjmp()和setjmp()聯合體運行於異常生命期的2和3階段。longjmp(j,r)產生異常對象r(一個整數),並且作為傳回值傳送到setjmp(j)處。實際上,setjmp()函數通報了異常r。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.