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行目以降が実行されます。

 

setjmp

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

 

[指定形式]

#include <setjmp.h>

long setjmp(jmp_buf env);

 

[引数]

env 実行環境を退避する記憶域へのポインタ

 

[戻り値]

setjmp関数を呼び出した時 :0

longjmp関数からのリターン時 :0以外

 

[備考]

setjmp関数により退避された実行環境は、longjmp関数において使用されます。

setjmp関数として呼び出された時のリターン値は0ですが、longjmp関数からリターンしてきた時のリターン値は、longjmp関数で指定した第2引数の値となります。

setjmp関数を複雑な式から呼び出す場合、式の評価の途中結果等の現在の実行環境の一部が失われる可能性があります。setjmp関数はsetjmp関数の結果と定数式の比較という形だけで使用し、複雑な式の中では呼び出さないようにしてください。

setjmp関数へのポインタを使った間接呼び出しはしないでください。

 

longjmp

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

 

[指定形式]

#include <setjmp.h>

void longjmp(jmp_buf env, long ret);

 

[引数]

env 実行環境を退避した記憶域へのポインタ

ret setjmp関数へのリターンコード

 

[備考]

longjmp関数は、同じプログラム中で最後に呼び出されたsetjmp関数によって退避された関数の実行環境を第1引数envで指定された記憶域から回復し、そのsetjmp関数を呼び出したプログラムの位置に制御を移します。この時longjmp関数の第2引数retがsetjmp関数のリターン値として返ります。ただし、retが0の時はsetjmp関数へのリターン値としては1が返ります。

setjmp関数が呼び出されていない時、あるいはsetjmp関数を呼び出した関数がすでにreturn文を実行している時は、longjmp関数の動作は保証しません。