Everything

longjmp


非局所分岐を行います。

[所属]

標準ライブラリ

[指定形式]

#include <setjmp.h>

void longjmp(jmp_buf env, int val);

[詳細説明]

setjmpで保存されたenvを使い,setjmp直後へ非局所分岐します。valは,setjmpの返却値となります。

 

【setjmp.hにおけるjmp_buf型の定義】

typedef int     jmp_buf[14];

[注意事項]

本関数が退避/復帰するのはコンパイラで予約したレジスタのみです。

22レジスタ・モード, または共通レジスタ・モードの関数内でsetjmpを呼び出し,32レジスタ・モードの関数内でr20~r24を破壊した後に本関数を呼び出した場合,r20~r24の値は回復しません。本関数を呼び出す前に,r20~r24を回復しておく必要があります。

[使用例]

#include    <setjmp.h>
#define ERR_XXX1    1
#define ERR_XXX2    2
 
jmp_buf jmp_env;
 
void main(void) {
    for(;;) {
        switch(setjmp(jmp_env)) {
            case    ERR_XXX1:
                /*error XXX1の終結処理*/
                break;
            case    ERR_XXX2:
                /*error XXX2の終結処理*/
                break;
            case    0:          /*非局所分岐ではない*/
            default:
                break;
        }
    }
}
 
void funcXXX(void) {
    longjmp(jmp_env, ERR_XXX1); /*error XXX1の発生により非局所分岐*/
    longjmp(jmp_env, ERR_XXX2); /*error XXX2の発生により非局所分岐*/
}