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を実行
エラー発生!
エラーをキャッチ。
コメント