この章の目次にもどる
前頁:1.5 bmath.h にもどる
次頁:1.7 bstdio.h にすすむ

1.6 bsetjmp.h

setjmp / longjmp の定義。 jmp_buf は CPU によってその定義は異なっている。

□ レジスタを保存するための型

    typedef int jmp_buf[6];
setjmp
 
大域ジャンプ用の環境セーブ

【形式】

int setjmp(jmp_buf env)

【パラメータ】

jmp_buf env 環境を保存するための領域

【リターン値】

≠0 longjmpの呼び出しから復帰する場合
    (実際は longjmp() の引数 rval の値を返す)
=0 setjmpを呼び出して戻ってきた場合

【解説】

呼び出した時点での環境を保存し、longjmp が実行された時に復帰できる状態にする。 setjmp() は以下のいずれかに使用すること。

  選択文(if, switch)の制御式
  反復文(while, do〜while, for)の制御式
  制御式中の、一方が整数定数式である関係演算子のオペランド
  制御式中の、等価演算子のオペランド
  制御式中の、!演算子のオペランド
  式文の全ての式

次の処理から抜けるために longjmp() を使用するのは危険である。

  割り込み処理
  例外処理
  シグナル処理

setjmp() はインライン展開できる、 単純化した式として、局所変数、 一時変数を必要としないようにすること。

【参照】

longjmp()

longjmp
 
スタックの復帰

【形式】

void    longjmp(jmp_buf env, int rval)

【パラメータ】

jmp_buf env     保存した環境の領域
int     rval    setjmp()のリターン値として使う値(≠0)

【リターン値】

なし

【解説】

最後に実行した setjmp() により配列 env に保存された環境を復元する。 実行は setjmp() を呼んだ場所から始まる。

当関数は元の setjmp() の呼出側に引数 rval を返す。この時 rvalsetjmp() が返したようにみなしても良い。 rval に 0 が指定された場合、setjmp のリターン値は1となる。

setjmp() で環境保存されていない場合に longjmp() を呼び出すと動作は保証されない。

【参照】

setjmp()


この章の目次にもどる
前頁:1.5 bmath.h にもどる
次頁:1.7 bstdio.h にすすむ