longjmp
ja.cppreference.net より
| ヘッダで定義 <setjmp.h>
|
||
void longjmp( jmp_buf env, int status );
|
(until C11) | |
_Noreturn void longjmp( jmp_buf env, int status );
|
(since C11) (until C23) |
|
[[noreturn]] void longjmp( jmp_buf env, int status );
|
(since C23) | |
実行コンテキストをロードする env 以前の呼び出しで保存された setjmp 。この関数は戻らない。制御はマクロの呼び出し元に転送される setjmp を設定した env 。その setjmp 次に、statusとして渡された値を返す。
を呼び出した関数 setjmp が終了した場合(return またはスタックの上位にある別のlongjmpによる場合でも)、動作は未定義です。言い換えると、コールスタックを上方向へのlongjumpのみが許可されます。
|
スレッドを跨いだジャンプ( |
(since C11) |
|
もし setjmp が呼び出されたときに、 VLA または別の 可変変更型 変数がスコープ内にあり、制御がそのスコープを離れた場合、 スタックを上る途中で、 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
}
|
(since C99) |
パラメータ
| env | - | setjmp |
| によって保存されたプログラムの実行状態を参照する変数 | - | setjmp から返す値。0 と等しい場合、代わりに 1 が使用される。
|
ノート
longjmp は、関数が意味のある戻り値を返せない予期しないエラー条件を処理するためのものです。これは他のプログラミング言語の例外処理に似ています。
例
このコードを実行
#include <setjmp.h>
#include <stdio.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
参考文献
- C23規格(ISO/IEC 9899:2024):
- 7.13.2.1 The longjmp macro (p: 283-284)
- 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
| |