高等 C 語言 -- setjump 與 longjump

高等 C 語言

簡介

字串

指標與陣列

函數

結構

物件導向

記憶體

檔案

錯誤處理

巨集處理

C 與組合語言

資料結構

動態字串

動態陣列

鏈結串列

雜湊表

開發環境

Make

Cygwin

MinGW

DevC++

wxDevC++

編譯器

gcc 編譯器

TinyCC 編譯器

LCC 編譯器

應用主題

CGI 程式

GNU 程式

視窗程式

影像處理

練習題

訊息

相關網站

參考文獻

最新修改

簡體版

English

程式範例: setjump 與 longjump

#include <stdio.h>
#include <setjmp.h>
 
jmp_buf jumper;
 
int div(int a, int b) {
  if (b == 0) { // can't divide by 0
    longjmp(jumper, -3);
  }
  return a / b;
}
 
int main(int argc, char *argv[]) {
  int jstatus = setjmp(jumper);
  if (jstatus == 0) {
    int a = atoi(argv[1]);
    int b = atoi(argv[2]);
    printf("%d/%d", a, b);
    int result = div(a, b);
    printf("=%d\n", result);
  } 
  else if (jstatus == -3)
    printf(" --> Error:divide by zero\n");
  else
    printf("Unhandled Error Case");
}

執行結果

D:\cp>gcc jump.c -o jump

D:\cp>jump 7 2
7/2=3

D:\cp>jump 7 0
7/0 --> Error:divide by zero

來自 jserv 的建議

=> 請提及 C 語言作例外處理的重要性,以及如何用 setjump/longjump 實做 user-level thread 和 coroutine

可參見拙作: http://blog.linux.org.tw/~jserv/archives/001848.html

參考文獻

  1. Java2s (C / ANSI-C) » setjmp.h » longjmp, http://www.java2s.com/Code/C/setjmp.h/longjmplongjump.htm
  2. Exception Handling in C without C++ — Clean error handling without overhead, by Tom Schotland and Peter Petersenhttp://www.on-time.com/ddj0011.htm
  3. 第16集 C语言中一种更优雅的异常处理机制, 作者:王胜祥 来源:希赛网 http://www.csai.cn 2005年5月19
  4. 第17集 全面了解setjmp与longjmp的使用, 作者:王胜祥 来源:希赛网 http://www.csai.cn 2005年5月21

Facebook

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License