名前空間
変種
操作

std::longjmp

提供: cppreference.com
< cpp‎ | utility‎ | program
 
 
 
プログラムサポートユーティリティ
プログラム終了
(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() will return count+1
}
 
int main()
{
    volatile int count = 0; // local variables must be volatile for setjmp
    if (setjmp(jump_buffer) != 9) {
        a(count++);  // This will cause setjmp() to exit
    }
}

出力:

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]