名前空間
変種
操作

setjmp

提供: cppreference.com
< cpp‎ | utility‎ | program
 
 
 
プログラムサポートユーティリティ
プログラム終了
(C++11)
(C++11)
環境との通信
シグナル
シグナルの種類
非ローカルジャンプ
setjmp
 
ヘッダ <csetjmp> で定義
#define setjmp(env) /* implementation-defined */

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

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

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

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

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

目次

[編集] 引数

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

[編集] 戻り値

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

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

[編集]

#include <iostream>
#include <csetjmp>
 
std::jmp_buf jump_buffer;
 
[[noreturn]] void a(int count) 
{
    std::cout << "a(" << count << ") called\n";
    std::longjmp(jump_buffer, count+1);  // setjmp() will return count+1
}
 
int main()
{
    volatile int count = 0; // modified locals in setjmp scope must be volatile
    if (setjmp(jump_buffer) != 9) { // equality against constant expression in an if
        a(++count);  // This will cause setjmp() to exit
    }
}

出力:

a(1) called
a(2) called
a(3) called
a(4) called
a(5) called
a(6) called
a(7) called
a(8) called

[編集] 関連項目

指定された場所へジャンプします
(関数) [edit]