longjmp
From cppreference.com
| ヘッダ <setjmp.h> で定義 |
||
| void longjmp( jmp_buf env, int status ); |
(C11まで) | |
| _Noreturn void longjmp( jmp_buf env, int status ); |
(C11 以降) (C23まで) |
|
| [[noreturn]] void longjmp( jmp_buf env, int status ); |
(C23以降) | |
setjmp マクロが以前に保存した実行コンテキスト env をロードします。この関数は返りません。制御は、env を設定したマクロ setjmp の呼び出し元に転送されます。その setjmp は、status として渡された値を返します。
setjmp を呼び出した関数が終了した場合(戻り値によるか、スタック上のより上位の longjmp によるかに関わらず)、動作は未定義です。つまり、呼び出しスタックを上にジャンプすることのみが許可されます。
|
スレッドをまたぐジャンプ( |
(C11 以降) |
|
スタックを上に移動する際、 void g(int n) { int a[n]; // a may remain allocated h(n); // does not return } void h(int n) { int b[n]; // b may remain allocated longjmp(buf, 2); // might cause a memory leak for h's b and g's a } |
(C99以降) |
目次 |
[編集] パラメータ
| env | - | setjmp によって保存されたプログラムの実行状態を参照する変数。 |
| status | - | setjmp から返される値。もし 0 に等しい場合、代わりに 1 が使用されます。 |
[編集] 戻り値
(なし)
[編集] 注記
longjmp は、関数が意味のある値を返せない予期せぬエラー条件を処理するために使用されます。これは、他のプログラミング言語における例外処理に似ています。
[編集] 例
このコードを実行
#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.2.1 The longjmp macro (p: 191-192)
- C11標準 (ISO/IEC 9899:2011)
- 7.13.2.1 The longjmp macro (p: 263-264)
- C99標準 (ISO/IEC 9899:1999)
- 7.13.2.1 The longjmp macro (p: 244-245)
- C89/C90標準 (ISO/IEC 9899:1990)
- 4.6.2.1 The longjmp function
[編集] 関連項目
| コンテキストを保存する (関数マクロ) | |
| C++ ドキュメント (longjmp について)
| |