名前空間
変種
操作

std::longjmp

提供: 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)
環境との通信
シグナル
シグナルの種類
非ローカルジャンプ
longjmp
 
ヘッダ <csetjmp> で定義
             void longjmp( std::jmp_buf env, int status );
(C++17未満)
[[noreturn]] void longjmp( std::jmp_buf env, int status );
(C++17以上)

setjmp の以前の呼び出しで保存された実行コンテキスト env をロードします。 この関数は戻りません。 制御は env をセットアップした setjmp マクロの呼び出し元に転送されます。 その後 setjmpstatus に渡された値を返します。

setjmp を呼び出した関数が終了していた場合、動作は未定義です (言い換えると、コールスタックの上方向への longjmp しか許されません)。

自動オブジェクトのデストラクタは呼ばれません。 もし std::longjmpthrowsetjmpcatch で置き換えれば何らかの自動オブジェクトに対する非トリビアルなデストラクタが呼ばれるならば、そのような std::longjmp の動作は未定義です。

目次

[編集] 引数

env - setjmp によって保存されたプログラムの実行状態を参照する変数
status - setjmp から返す値。 0 と等しい場合は、代わりに 1 が使用されます

[編集] 戻り値

(なし)

[編集] ノート

longjmp は、関数が意味のある戻りを行えない、予期しないエラー状況を処理するために、 C で使用される仕組みです。 C++ では通常、この目的のためには例外処理を使用します。

[編集]

#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) {
        a(count++);  // これにより setjmp() からの脱出が発生します。
    }
}

出力:

a(0) called
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]