Light C | ← → 目次 索引 |
int setjmp( jmp_buf env );
longjmp のジャンプ先をあらかじめ記憶します。env に現在の状態が記憶され、0 が返されます。jmp_buf は、setjmp.h で構造体の配列として定義されていますが、その内容を気にする必要はありません。
void longjmp( jmp_buf env, int rv );
setjmp で記憶した場所にジャンプします。この関数を利用すると、たとえば、関数呼び出し階層の深いレベルから、一気に数段上のレベルに戻ることができます。
env には、setjmp で内容を記憶した変数を指定します。プログラムの実行は、その env を記憶した setjmp 関数から戻ったかのように続行されます。rv には、setjmp 関数からの (疑似的な) 戻り値を指定します。通常、rv には、最初の setjmp 呼び出しと区別できるように、0 以外の値を指定します。
setjmp 関数を呼び出した関数とは異なる関数から、その記憶場所への longjmp を呼び出すことができます。ただし、setjmp を呼び出した関数が終了した後で、longjmp 関数を呼び出すことはできません。
複数の env 変数を定義できるため、任意の数のジャンプ先を setjmp で記憶できます。
例 | jmp_buf env; | // ジャンプ先記憶域 |
void sub1() { | ||
longjmp( env, 7 ); | // 戻り値 7 でジャンプ | |
printf( "never\n" ); | // この文は実行されない | |
} | ||
void sub2() { | ||
sub1(); | ||
} | ||
main() { | ||
int r = setjmp( env ); | // ここを記憶 | |
if ( r == 0 ) { | // 登録時は戻り値 0 | |
printf( "registered\n" ); | ||
sub2(); | // この下でジャンプが行われる | |
printf( "never\n" ); | // この文は実行されない | |
} | ||
else | // ジャンプで戻ったときは戻り値 7 | |
printf( "returned with %d\n", r ); | ||
} |
結果 | |
registered | |
returned with 7 |
Copyright © Tama Software Ltd, 1999-2012. | ← → 目次 索引 |