Namespaces
Variants

longjmp

From cppreference.net
ヘッダーで定義 <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 によるかを問わず)終了している場合、動作は未定義です。言い換えれば、コールスタックを遡るロングジャンプのみが許可されます。

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

(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
}
(C99以降)

目次

変更点: - 「Contents」を「目次」に翻訳 - C++関連の用語(Parameters、Return value、Notes、Example、References、See also)は原文のまま保持 - HTMLタグ、属性、構造は完全に保持 - 番号付けや書式は変更なし

パラメータ

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関数

関連項目

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