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

先頭へ戻る

setjmp関数

概要 呼び出し環境を保存する
ヘッダ setjmp.h
形式 int setjmp(jmp_buf env);
引数 env 呼び出し環境を保存しておくためのバッファ。
戻り値 普通にこの関数を呼び出したときは常に 0 が返される。longjmp関数の呼び出しによって呼び出し環境が復元されたときには 0以外の値を返す。
詳細 のちの longjmp関数の呼び出しに先立って、復元される呼び出し環境を保存しておく。つまり、自動記憶域期間を持つオブジェクトの値や、レジスタの情報など、setjmp関数を呼び出した時点での状況を jmp_buf型のオブジェクトに保存する。また、setjmp関数を呼び出している位置そのものが、実行の復帰位置である。
自動記憶域期間でない記憶域期間を持ったオブジェクトの値は保存しない。ファイルのオープン状態も保存されない。C99以降では、浮動小数点例外のフラグについても保存しない。
setjmp関数はマクロとして実装されているかもしれない。
注意 volatile修飾子がない自動記憶域期間を持つオブジェクトの値が、setjmp関数の呼び出しと、longjmp関数の呼び出しとの間で変更された場合、復元後の値は不定である。
setjmp関数の呼び出しは、式文の中で単体で行うか、if/switch、while/for/do といった選択文や繰り返し文の条件式の部分か、他方のオペランドが整数の定数式であるような関係演算子や等価演算子のオペランドでなければならない。例えば「int x = setjmp(env);」のような使い方は未定義の動作になる。
使用例
#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
関連 呼び出し環境を復元するには longjmp関数を呼び出す。
解説章


参考リンク



更新履歴

'2018/4/26 新規作成。



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

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

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

Programming Place Plus のトップページへ


はてなブックマーク Pocket に保存 Twitter でツイート Twitter をフォロー
Facebook でシェア Google+ で共有 LINE で送る rss1.0 取得ボタン RSS
管理者情報 プライバシーポリシー