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

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

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


setjmp関数

概要

呼び出し環境を保存する

ヘッダ

setjmp.h

形式

int setjmp(jmp_buf env);

引数

env

呼び出し環境を保存しておくためのバッファ。

戻り値

普通にこの関数を呼び出したときは常に 0 が返される。longjmp関数の呼び出しによって呼び出し環境が復元されたときには 0以外の値を返す。

詳細

のちの longjmp関数の呼び出しに先立って、復元される呼び出し環境を保存しておく。つまり、自動記憶域期間を持つオブジェクトの値や、レジスタの情報など、setjmp関数を呼び出した時点での状況を jmp_buf型のオブジェクトに保存する。また、setjmp関数を呼び出している位置そのものが、実行の復帰位置である。

自動記憶域期間でない記憶域期間を持ったオブジェクトの値は保存しない。ファイルのオープン状態も保存されない。浮動小数点例外のフラグについても保存しない。

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

実行結果

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

関連

呼び出し環境を復元するには longjmp関数を呼び出す。

解説章


参考リンク


更新履歴

’2018/4/26 新規作成。



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

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

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

Programming Place Plus のトップページへ



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