setjmp
提供: cppreference.com
<tbody>
</tbody>
| ヘッダ <setjmp.h> で定義
|
||
#define setjmp(env) /* implementation-defined */ |
||
現在の実行コンテキストを jmp_buf 型の変数 env に保存します。 この変数は後に longjmp 関数によって現在の実行コンテキストを復元するために使用することができます。 つまり、 longjmp 関数の呼び出しが行われたとき、実行は longjmp に渡された jmp_buf 変数が構築された特定の呼び出し元で継続されます。 その場合 setjmp は longjmp に渡された値を返します。
setjmp の呼び出しは以下の文脈のいずれかでのみ現れなければなりません。
switch(setjmp(env)) { ..
if(setjmp(env) > 10) { ...
while(!setjmp(env)) { ...
- 式文の式全体 (
voidにキャストしても構いません)。
setjmp(env);
それ以外の文脈で setjmp が現れた場合、動作は未定義です。
setjmp のスコープに戻るにあたって、すべてのアクセス可能なオブジェクト、浮動小数点ステータスフラグ、および抽象機械のその他のコンポーネントは、 longjmp が実行されたとき持っていたのと同じ値を持ちます。 ただし、 setjmp の呼び出しを含む関数内の volatile でないローカル変数は除きます。 これらの値は、 setjmp の呼び出し後に変更されていた場合、不定になります。
引数
| env | - | プログラムの実行状態を保存する変数 |
戻り値
元のコードによってマクロが呼ばれ、実行コンテキストが env に保存された場合は 0。
非ローカルジャンプが行われた場合は非ゼロの値。 戻り値は longjmp に渡されたものと同じです。
ノート
前述の要件によりデータフロー中で (すなわちオブジェクトを初期化するためやオブジェクトに代入するために) setjmp の戻り値を使用することは禁止されます。 戻り値は制御フロー中で使用することまたは破棄することだけができます。
例
Run this code
#include <stdio.h>
#include <setjmp.h>
#include <stdnoreturn.h>
jmp_buf jump_buffer;
noreturn void a(int count)
{
printf("a(%d) called\n", count);
longjmp(jump_buffer, count+1); // will return count+1 out of setjmp
}
int main(void)
{
volatile int count = 0; // modified local vars in setjmp scope must be volatile
if (setjmp(jump_buffer) != 9) // compare against constant in an if
a(++count);
}
出力:
a(1) called
a(2) called
a(3) called
a(4) called
a(5) called
a(6) called
a(7) called
a(8) called