longjmp | Programming Place Plus C言語編 標準ライブラリのリファレンス

トップページC言語編標準ライブラリのリファレンス(名前順)

トップページC言語編標準ライブラリのリファレンス(ヘッダ別)


longjmp関数

概要

呼び出し環境を復元する

ヘッダ

setjmp.h

形式

void longjmp(jmp_buf env, int val);

引数

env

setjmp関数に渡した jmp_buf型のオブジェクト

val

復元後に setjmp関数の戻り値として使う値。0 を指定した場合は 1 に修正される

戻り値

なし

詳細

setjmp関数によって保存された呼び出し環境を復元する。自動記憶域期間をもつオブジェクトの値やレジスタの値など、実行の再開に必要な情報が復元された後、setjmp関数の呼び出し箇所にジャンプし、setjmp関数の呼び出しから戻ってくる形で再開する。このとき、setjmp関数の戻り値が、longjmp関数の第2引数の値になる。ただし 0 を指定していた場合は 1 に修正される(setjmp関数を普通に呼び出したときに 0 を返す仕様であるため、それと区別を付けるための処置である)。

setjmp関数を呼び出した位置と、longjmp関数を呼び出す位置が、別関数内であっても構わない。つまり、別関数への goto のような処理が実現できる。これは非局所ジャンプと呼ばれる。ただし、すでに実行を終えている関数へはジャンプできない。

注意

volatile修飾子がない自動記憶域期間を持つオブジェクトの値が、setjmp関数の呼び出しと、longjmp関数の呼び出しとの間で変更された場合、復元後の値は不定である。

使用例

#include <stdio.h>
#include <setjmp.h>

jmp_buf g_env;
int g = 100;

void func(void)
{
    g *= 2;
    longjmp(g_env, 1);
}

int main(void)
{
    int x = 10;
    volatile int y = 20;

    if (setjmp(g_env) == 0) {
        // 普通に setjmp関数が呼び出された後
        y *= 2;
        g *= 2;
        func();
    }
    else {
        // longjmp関数によって復元された後

        printf("x == %d, y == %d, g == %d\n", x, y, g);
        // もし、x の値が setjmp関数の呼び出しから longjmp関数の呼び出しの間で
        // 書き換えられていた場合、ここで x を参照してはならない。
    }
}

実行結果

x == 10, y == 40, g == 400

関連

呼び出し環境は setjmp関数を使って、jmp_buf型のオブジェクトへ保存する。

解説章


参考リンク


更新履歴

’2018/4/26 新規作成。



標準ライブラリのリファレンス(名前順)のトップページへ

標準ライブラリのリファレンス(ヘッダ別)のトップページへ

C言語編のトップページへ

Programming Place Plus のトップページへ



はてなブックマーク に保存 Pocket に保存 Facebook でシェア
X で ポストフォロー LINE で送る noteで書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る