[C言語 標準ライブラリ] setjmp.hの使い方

※本ブログでは、商品・サービスのリンク先にプロモーションを含みます。

スポンサーリンク

setjmp.hには、外部の関数にジャンプための型、関数、およびマクロが宣言、定義されています。

スポンサーリンク

jmp_buf

呼び出し環境を保存するための型。
setjmp、longjmpで使用されます。

関数

int setjmp(jmp_buf env)

呼出し環境を、後でlongjmp関数が使用する時のために、envに保存します。
直接の呼出しから復帰するときは0、longjmp関数の呼出しから復帰するときは0以外の値が返されます。

void longjmp(jmp_buf env, int val)

setjmpによって保存された環境を復元します。
longjmpの完了により、対応するsetjmpマクロがvalで指定された値を返したとして、処理が続行されます。
longjmp関数は、setjmpに0を返させることはできず、もしvalが0ならば、setjmpマクロの戻り値は1となります。

setjmpとlongjmpの使用例

setjmpとlongjmpは、例外処理を実装するためによく使われます。
もし何らかのエラーが起きた場合に、プログラムの実行を特定の場所に戻すことができます。

使用例:

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

static jmp_buf buf;

void Func3(int value) {
    if(value == 0){
        printf("エラー発生!\n");
        longjmp(buf, 1);
    }
    printf("Func3を実行\n");
}

void Func2(int value) {
    printf("Func2を実行\n");
    Func3(value);
}

void Func1(int value) {
    if(setjmp(buf) != 0){  // longjmpからジャンプしてきた場合にのみ0以外の値が返る
        printf("エラーをキャッチ。\n");
    }else{
        printf("Func1を実行\n");
        Func2(value);
    }
}

int main(void)
{ 
    Func1(0);

    return 0;
}

このプログラムでは、Func3関数が0の場合にエラーが発生することとします。
このエラーを捉えて、プログラムの実行をFunc1関数に戻します。

実行結果:

Func1を実行
Func2を実行
エラー発生!
エラーをキャッチ。
スポンサーリンク
C言語

コメント