longjmp
|
ヘッダーで定義
<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
を呼び出した関数が(returnによるか、スタック上位での別の
longjmp
によるかを問わず)終了している場合、動作は未定義です。言い換えれば、コールスタックを遡るロングジャンプのみが許可されます。
|
別のスレッドを跨ぐジャンプ(
|
(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 } |
(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 longjmpマクロ (p: 191-192)
- C11規格 (ISO/IEC 9899:2011):
-
- 7.13.2.1 longjmpマクロ (p: 263-264)
- C99規格 (ISO/IEC 9899:1999):
-
- 7.13.2.1 longjmpマクロ (p: 244-245)
- C89/C90標準 (ISO/IEC 9899:1990):
-
- 4.6.2.1 longjmp関数
関連項目
|
コンテキストを保存
(関数マクロ) |
|
|
C++ documentation
for
longjmp
|
|