Namespaces
Variants

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のみが許可されます。

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

(since C11)

もし setjmp が呼び出されたときに、 VLA または別の 可変変更型 変数がスコープ内にあり、制御がそのスコープを離れた場合、longjmp への setjmp は、制御が関数内に留まっていても未定義動作を呼び起こします。

スタックを上る途中で、longjmp は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

関連項目

コンテキストを保存する
(関数マクロ)