Everything
7.4.9 <setjmp.h>

関数間の制御の移動をサポートします。

以下のマクロは、処理系定義です。

種別

定義名

説明

(マクロ)

jmp_buf

関数間の制御の移動を可能とする情報を保存しておくための記憶域に対応する型名です。

関数

setjmp

現在実行中の関数のjmp_bufで定義した実行環境を指定した記憶域に退避します。

longjmp

setjmp関数で退避していた関数の実行環境を回復し、setjmp関数を呼び出したプログラムの位置に制御を移動します。

 

setjmp関数は現在の関数の実行環境を退避します。その後longjmp関数を呼び出すことにより、setjmp関数を呼び出したプログラム上の位置に戻ることができます。

 

以下にsetjmp、longjmp関数を使用して関数間の制御の移動をサポートした例を示します。

 

    1   #include <stdio.h>
    2   #include <setjmp.h>
    3   jmp_buf env;
    4   void sub();
    5   void main()
    6   {
    7
    8       if (setjmp(env)!=0){
    9           printf("return from longjmp\n");
    10          exit(0);
    11      }
    12      sub();
    13  } 
    14
    15  void sub()
    16  {
    17      printf("subroutine is running \n");
    18      longjmp(env,1);
    19  }

 

【説明】

8行目でsetjmp関数を呼んでいます。この時、setjmp関数の呼び出された環境を、jmp_buf型の変数envに退避します。この時のリターン値は0なので、次に関数subが呼び出されます。

関数subの中で呼び出されるlongjmp関数により、変数envに退避した環境を回復します。その結果、プログラムは、あたかも8行目のsetjmp関数からリターンしたかのようにふるまいます。ただし、この時のリターン値はlongjmp関数の第2実引数で指定した値(1)になります。

その結果、9行目以降が実行されます。