名前空間
変種
操作

longjmp

From cppreference.com
< c‎ | program
ヘッダ <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 によるかに関わらず)、動作は未定義です。つまり、呼び出しスタックを上にジャンプすることのみが許可されます。

スレッドをまたぐジャンプ(setjmp を呼び出した関数が別のスレッドで実行されていた場合)も未定義の動作です。

(C11 以降)

setjmp が呼び出されたときに、スコープ内に VLA またはその他の 可変長型 の変数が存在し、そのスコープを抜けた場合、制御がその setjmp に戻ったとしても、longjmp は未定義の動作を引き起こします。

スタックを上に移動する際、longjmp は VLAs を解放しません。それらのライフタイムがこのように終了する場合、メモリリークが発生する可能性があります。

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 について)
English 日本語 中文(简体) 中文(繁體)