setjmp
提供: cppreference.com
ヘッダ <csetjmp> で定義
|
||
#define setjmp(env) /* implementation-defined */ |
||
現在の実行コンテキストを std::jmp_buf 型の変数 env
に保存します。 この変数は後に std::longjmp 関数によって現在の実行コンテキストを復元するために使用することができます。 つまり、 std::longjmp 関数の呼び出しが行われたとき、実行は std::longjmp に渡された std::jmp_buf 変数が構築された特定の呼び出し元で継続されます。 その場合 setjmp は std::longjmp に渡された値を返します。
setjmp
の呼び出しは以下の文脈のいずれかでのみ現れなければなりません。
switch(setjmp(env)) { ...
if(setjmp(env) > 0) { ...
while(!setjmp(env)) { ...
- 式文の式全体 (
void
にキャストしても構いません)。
setjmp(env);
それ以外の文脈で setjmp
が現れた場合、動作は未定義です。
setjmp
のスコープに戻るにあたって、すべてのアクセス可能なオブジェクト、浮動小数点ステータスフラグ、および抽象機械のその他のコンポーネントは、 std::longjmp が実行されたとき持っていたのと同じ値を持ちます。 ただし、 setjmp
のスコープ内の volatile でないローカル変数は除きます。 これらの値は、 setjmp の呼び出し後に変更されていた場合、不定になります。
目次 |
[編集] 引数
env | - | プログラムの実行状態を保存する変数 |
[編集] 戻り値
元のコードによってマクロが呼ばれ、実行コンテキストが env
に保存された場合は 0。
非ローカルジャンプが行われた場合は非ゼロの値。 戻り値は std::longjmp に渡されたものと同じです。
[編集] 例
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) { // 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
[編集] 関連項目
指定された場所へジャンプします (関数) | |
setjmp の C言語リファレンス
|