setjmpは,初めて呼び出されたときには値 0 を返します。その後,
setjmpの呼び出しと同じ環境を指定して
longjmpを呼び出すと,制御は通常どおりに返ったかのように再び
setjmp呼び出しに戻されます。この 2 回目のリターンにおける
setjmpの戻り値は,
longjmp呼び出しで指定された値です。
setjmpの真の値を保存するためには,対応する
longjmpが呼び出されるまで,
setjmpを呼び出す関数を再び呼び出さないようにする必要があります。
setjmp関数はハードウェア汎用レジスタを保存し,
longjmp関数はそれらを復元します。
longjmpの後には,
volatileとしてマークされていないローカル自動変数を除くすべての変数が,
longjmpの時点の値を持つようになります。
volatileとしてマークされていないローカル自動変数の値は不定です。
setjmpおよび
longjmp関数は, OpenVMS 条件処理機能を使用して,シグナル・ハンドラによる非ローカル goto を実現します。
longjmp関数は, HP C RTL 指定のシグナルを生成し, OpenVMS 条件処理機能がデスティネーションに戻れるようにすることで実装されています。
HP C RTL は,任意の HP C イメージのシグナル処理を制御できなくてはなりません。 HP C がシグナル処理を制御できるようにするためには,すべての例外処理を
VAXC$ESTABLISH関数の呼び出しを通して設定しなくてはなりません。詳細については,『HP C ランタイム・ライブラリ・リファレンス・マニュアル(上巻)』第 4.2.5 項と,
VAXC$ESTABLISH関数を参照してください。
| 注意
OpenVMS Alpha システムと OpenVMS Integrity システムの C RTL には,標準とは異なる
decc$setjmp関数と
decc$fast_longjmp関数が用意されています。標準関数の代わりにこれらの非標準関数を使用するためには,プログラムを __FAST_SETJMP または __UNIX_SETJMP マクロを定義してコンパイルする必要があります。
標準の
longjmp関数とは異なり,
decc$fast_longjmp関数は第 2 引数を 0 から 1 に変換しません。
decc$fast_longjmpの呼び出しの後,対応する
setjmp関数は,
decc$fast_longjmp呼び出しで指定された第 2 引数とまったく同じ値で返ります。
|