名前空間
変種
操作

setjmp

提供: cppreference.com
< c‎ | program
ヘッダ <setjmp.h> で定義
#define setjmp(env) /* implementation-defined */

現在の実行コンテキストを jmp_buf 型の変数 env に保存します。 この変数は後に longjmp 関数によって現在の実行コンテキストを復元するために使用することができます。 つまり、 longjmp 関数の呼び出しが行われたとき、実行は longjmp に渡された jmp_buf 変数が構築された特定の呼び出し元で継続されます。 その場合 setjmplongjmp に渡された値を返します。

setjmp の呼び出しは以下の文脈のいずれかでのみ現れなければなりません。

switch(setjmp(env)) { ..
  • 結果の式が if, switch, while, do-while, for の全体である、一方の被演算子が整数定数式の、関係演算子または等価演算子の他方の被演算子。
if(setjmp(env) > 10) { ...
while(!setjmp(env)) { ...
  • 式文の式全体 (void にキャストしても構いません)。
setjmp(env);

それ以外の文脈で setjmp が現れた場合、動作は未定義です。

setjmp のスコープに戻るにあたって、すべてのアクセス可能なオブジェクト、浮動小数点ステータスフラグ、および抽象機械のその他のコンポーネントは、 longjmp が実行されたとき持っていたのと同じ値を持ちます。 ただし、 setjmp の呼び出しを含む関数内の volatile でないローカル変数は除きます。 これらの値は、 setjmp の呼び出し後に変更されていた場合、不定になります。

目次

[編集] 引数

env - プログラムの実行状態を保存する変数

[編集] 戻り値

元のコードによってマクロが呼ばれ、実行コンテキストが env に保存された場合は 0

非ローカルジャンプが行われた場合は非ゼロの値。 戻り値は longjmp に渡されたものと同じです。

[編集] ノート

前述の要件によりデータフロー中で (すなわちオブジェクトを初期化するためやオブジェクトに代入するために) setjmp の戻り値を使用することは禁止されます。 戻り値は制御フロー中で使用することまたは破棄することだけができます。

[編集]

#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

[編集] 参考文献

  • C11 standard (ISO/IEC 9899:2011):
  • 7.13.1.1 The setjmp macro (p: 262-263)
  • C99 standard (ISO/IEC 9899:1999):
  • 7.13.1.1 The setjmp macro (p: 243-244)
  • C89/C90 standard (ISO/IEC 9899:1990):
  • 4.6.1 The setjmp macro

[編集] 関連項目

指定された位置にジャンプします
(関数) [edit]