<csetjmp>ヘッダ †
<csetjmp>ヘッダは、通常の関数呼び出しと関数からの復帰を回避するための手段を提供する。これにより、結果として非局所分岐を実現することができる。<csetjmp>ヘッダが提供する非局所分岐の振る舞いは、例外処理に類似しているが、一般的には、より軽量であり、また安全ではない。
型 †
jmp_buf †
呼び出し環境保存のための型
解説
非局所分岐のための呼び出し環境を保存するための配列型。具体的な形式は処理系定義である。
jmp_buf 型には、setjmp マクロによって保存した環境に、longjmp 関数の呼び出しによって、実行を戻すために十分な情報を格納することができる。ただし、浮動小数点フラグや、オープンされているファイルの状態など、抽象計算機?の構成要素は保存されない。
マクロ †
setjmp †
呼び出し環境の保存
形式
int setjmp(jmp_buf jbuf);
引数
jbuf: 呼び出し環境の保存先
返却値
直接の呼び出しから復帰する場合は 0 を返す。longjmp 関数の呼び出しによって復帰する場合、longjmp 関数の第 2 引数として指定した値を返す。
解説
setjmp は、実引数 jbuf に longjmp 関数から復帰するために必要な環境を保存する。setjmp は以下の文脈でしか使用することができない。
- 選択文または繰返し文の条件全体。
- 他方の演算対象が汎整数式である等価演算子または関係演算子の演算対象。ただし、等価式または関係式は選択文または繰返し文の条件全体でなければならない。
- 単項 ! 演算子の演算対象。ただし、単項 ! 演算子の式は選択文または繰返し文の条件全体でなければならない。
- 式文の式全体 (void でキャストしてもよい)。
setjmp がマクロであるか、外部結合を持つ識別子であるかは未規定である。なお、実際の関数にアクセスするためにマクロ定義を抑止した場合、またはプログラムが setjmp を外部識別子として定義した場合の動作は未定義である。
関数 †
longjmp †
呼び出し環境の復元
形式
namespace std {
void longjmp(jmp_buf jbuf, int val);
}
形式
jbuf: 呼び出し環境
val: setjmp の返却値
解説
longjmp は、setjmp マクロが jbuf に対して最後に呼び出された時点の環境を復元する。以下の状況で longjmp を呼び出した場合の動作は未定義である。
- jbuf に対して、setjmp マクロの呼び出しが行われていない。
- setjmp マクロを呼び出した関数が、既に終了している。
- longjmp 関数の呼び出し位置から復帰する setjmp マクロの呼び出し位置までに、本来であれば解体されるべきオブジェクトがある。
アクセス可能なすべてのオブジェクトは、longjmp 関数が呼び出された時点の値を保持する。また、抽象計算機?の構成要素もすべて保持される*1。ただし、setjmp マクロを呼び出した関数内で定義された自動記憶域期間を持つ非 volatile オブジェクトの値は不定となる。
longjmp 関数が実行されると、あたかも jbuf に環境を保存した setjmp マクロから復帰したかのように振舞う。このときの setjmp マクロの返却値は、val で指定した値となる。ただし、val に 0 を指定した場合、(setjmp マクロを直接呼び出した場合と区別が付かなくなるため) 1 が返される。
Last-modified: Mon, 05 Dec 2005 15:30:03 JST (5561d)