setjmp
setjmp.h:インデックス への移動
ヘッダーファイル
setjmp.h
カテゴリ
その他のルーチン
プロトタイプ
int setjmp(jmp_buf jmpb);
説明
ローカルでないジャンプを設定します。
setjmp は,完全なタスク状態を jmpb に受け取り,0 を返します。
後で jmpb を使って longjmp を呼び出すと,取得されたタスク状態が復元され,setjmp が値 val とともに戻ってきたかのように処理が続行されます。
Win32 の場合,タスク状態には次のものが含まれます。
- セグメントレジスタは保存されない
- レジスタ変数
- EBX,EDI,ESI
- スタックポインタ(ESP)
- フレームポインタ(EBP)
- フラグは保存されない
このタスク状態は,setjmp を使って共同ルーチンを実装するために十分な情報を保持しています。
longjmp の前に setjmp を呼び出す必要があります。setjmp を呼び出して jmpb を設定するルーチンは,引き続きアクティブである必要があり,longjmp が呼び出されるまで戻ることはできません。先に戻っていた場合の結果は予想できません。
setjmp は,プログラムの下位レベルのサブルーチンで発生するエラーや例外の処理に役立ちます。
戻り値
setjmp は,最初に呼び出されたときに 0 を返します。longjmp の呼び出しから戻る場合,setjmp は 0 以外の値を返します(例を参照)。
例
#include <stdio.h>
#include <setjmp.h>
#include <stdlib.h>
void subroutine(jmp_buf);
int main(void)
{
int value;
jmp_buf jumper;
value = setjmp(jumper);
if (value != 0)
{
printf("Longjmp with value %d\n", value);
exit(value);
}
printf("About to call subroutine ... \n");
subroutine(jumper);
return 0;
}
void subroutine(jmp_buf jumper)
{
longjmp(jumper,1);
}
移植性
POSIX | Win32 | ANSI C | ANSI C++ |
---|---|---|---|
+ |
+ |
+ |
+ |