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

先頭へ戻る

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 を参照してはならない。
        */
    }

    return 0;
}

実行結果

x == 10, y == 40, g == 400
関連 呼び出し環境は setjmp関数を使って、jmp_buf型のオブジェクトへ保存する。
解説章


参考リンク

更新履歴

'2018/4/26 新規作成。





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

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

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

Programming Place Plus のトップページへ


このエントリーをはてなブックマークに追加
rss1.0 取得ボタン RSS