longjmp
setjmp.h:インデックス への移動
ヘッダーファイル
setjmp.h
カテゴリ
その他のルーチン
プロトタイプ
void longjmp(jmp_buf jmpb, int retval);
説明
ローカルでないジャンプを実行します。
longjmp の呼び出しは,最後に setjmp を呼び出して取得されたタスク状態を引数 jmpb に渡して復元します。その後,setjmp が値 retval とともに戻ってきたかのように処理が続行されます。
Win32 の場合,タスク状態には次のものが含まれます。
- レジスタ変数
- EBX,EDI,ESI
- スタックポインタ(ESP)
- フレームポインタ(EBP)
- セグメントレジスタは保存されない
- フラグは保存されない
このタスク状態は,setjmp および longjmp を使って共同ルーチンを実装するために十分な情報を保持しています。
longjmp の前に setjmp を呼び出す必要があります。setjmp を呼び出して jmpb を設定したルーチンは,引き続きアクティブである必要があり,longjmp が呼び出されるまで戻ることはできません。先に戻った場合の結果は予想できません。
longjmp は値 0 を渡すことができません。retval に 0 を渡すと,1 に置き換えられます。
戻り値
なし。
例
#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++ |
---|---|---|---|
+ |
+ |
+ |
+ |