setjmp
From cppreference.com
| ヘッダ <setjmp.h> で定義 |
||
| #define setjmp(env) /* 実装依存 */ |
||
現在の実行コンテキストを、型 jmp_buf の変数 env に保存します。この変数は、後で longjmp 関数によって現在の実行コンテキストを復元するために使用できます。つまり、longjmp 関数が呼び出されると、実行は、longjmp に渡された jmp_buf 変数を構築した特定の呼び出しサイトから再開されます。その場合、setjmp は longjmp に渡された値を返します。
setjmp の呼び出しは、次のいずれかのコンテキストでのみ出現する必要があります。
- if、switch、while、do-while、for の完全な制御式。
switch(setjmp(env)) { // ...
- 他のオペランドが整数定数式である関係演算子または等価演算子のオペランドの1つであり、結果の式が if、switch、while、do-while、for の完全な制御式となる場合。
if(setjmp(env) > 10) { // ...
- 単項 `!` 演算子のオペランドであり、結果の式が if、switch、while、do-while、for の完全な制御式となる場合。
while(!setjmp(env)) { // ...
- 式文(必要に応じて `void` にキャストされる)の完全な式。
setjmp(env);
setjmp が上記以外のコンテキストで出現した場合、動作は未定義です。
setjmp のスコープに戻ったとき
- アクセス可能なすべてのオブジェクト、浮動小数点ステータスフラグ、および抽象マシンのその他のコンポーネントは、longjmp が実行されたときの値と同じ値になります。
- ただし、
setjmpの呼び出しを含む関数内の非 volatile ローカル変数は、setjmpの呼び出し以降に変更されている場合、その値は不定となります。
目次 |
[編集] パラメータ
| env | - | プログラムの実行状態を保存する変数。 |
[編集] 戻り値
0 マクロが元のコードによって呼び出され、実行コンテキストが env に保存された場合。
非ローカルジャンプが実行された直後の場合、ゼロ以外の値。戻り値は、longjmp に渡された値と同じです。
[編集] 注意
上記の要件により、setjmp の戻り値をデータフロー(例:オブジェクトの初期化や代入)で使用することは禁止されています。戻り値は、制御フローでのみ使用するか、破棄することができます。
[編集] 例
このコードを実行
#include <stdio.h> #include <setjmp.h> #include <stdnoreturn.h> jmp_buf my_jump_buffer; noreturn void foo(int status) { printf("foo(%d) called\n", status); longjmp(my_jump_buffer, status + 1); // will return status+1 out of setjmp } int main(void) { volatile int count = 0; // modified local vars in setjmp scope must be volatile if (setjmp(my_jump_buffer) != 5) // compare against constant in an if foo(++count); }
出力
foo(1) called foo(2) called foo(3) called foo(4) called
[編集] 参照
- C17標準 (ISO/IEC 9899:2018)
- 7.13.1.1 The setjmp macro (p: 191)
- C11標準 (ISO/IEC 9899:2011)
- 7.13.1.1 The setjmp macro (p: 262-263)
- C99標準 (ISO/IEC 9899:1999)
- 7.13.1.1 The setjmp macro (p: 243-244)
- C89/C90標準 (ISO/IEC 9899:1990)
- 4.6.1 The setjmp macro
[編集] 関連項目
| 指定された場所にジャンプする (関数) | |
| C++ ドキュメント for setjmp
| |