longjmp

提供: RAD Studio
移動先: 案内検索

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++

+

+

+

+