名前空間
変種
操作

setjmp

提供: cppreference.com
< cpp‎ | utility‎ | program
 
 
ユーティリティライブラリ
汎用ユーティリティ
日付と時間
関数オブジェクト
書式化ライブラリ (C++20)
(C++11)
関係演算子 (C++20で非推奨)
整数比較関数
(C++20)
スワップと型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
一般的な語彙の型
(C++11)
(C++17)
(C++17)
(C++17)
(C++17)

初等文字列変換
(C++17)
(C++17)
 
プログラムサポートユーティリティ
プログラム終了
(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() から count+1 が返されます。
}
 
int main()
{
    volatile int count = 0; // setjmp のスコープ内で変更されるローカル変数は volatile でなければなりません。
    if (setjmp(jump_buffer) != 9) { // if の制御式での定数式に対する等価比較。
        a(++count);  // これにより setjmp() からの脱出が発生します。
    }
}

出力:

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]