std::longjmp
提供: cppreference.com
<tbody>
</tbody>
<tbody class="t-dcl-rev ">
</tbody><tbody>
</tbody>
| ヘッダ <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 マクロの呼び出し元に転送されます。 その後 setjmp は status に渡された値を返します。
setjmp を呼び出した関数が終了していた場合、動作は未定義です (言い換えると、コールスタックの上方向への longjmp しか許されません)。
自動オブジェクトのデストラクタは呼ばれません。 もし std::longjmp を throw で setjmp を catch で置き換えれば何らかの自動オブジェクトに対する非トリビアルなデストラクタが呼ばれるならば、そのような std::longjmp の動作は未定義です。
引数
| env | - | setjmp によって保存されたプログラムの実行状態を参照する変数
|
| status | - | setjmp から返す値。 0 と等しい場合は、代わりに 1 が使用されます
|
戻り値
(なし)
ノート
longjmp は、関数が意味のある戻りを行えない、予期しないエラー状況を処理するために、 C で使用される仕組みです。 C++ では通常、この目的のためには例外処理を使用します。
例
Run this code
#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
関連項目
| コンテキストを保存します (関数マクロ) | |
longjmp の C言語リファレンス
| |