AVR Libc Home Page AVRs AVR Libc Development Pages
Main Page FAQ Library Reference Additional Documentation Example Projects

<setjmp.h>: Non-local goto


Detailed Description

C言語は goto ステートメントを忌み嫌ってきたため、goto 命令は同一のローカル関数内だけで使われることになっていました。他の(ローカルでない)関数にジャンプするためには、Cライブラリは関数 setjmp()longjmp() を提供しています。setjmp()longjmp() はエラー取扱や割り込みやローレベル処理のサブルーチンなどに有用です。

Note:
setjmp()longjmp()は、プログラムの理解やメンテナンスを困難にします。他の手段で解決可能なら他の手段を使うべきです。

longjmp() はグローバルレジスタ変数に対してなされた変更を破壊する可能性があります。(参照: How to permanently bind a variable to a register?).

setjmp()/longjmp() に関する詳細な議論は、Chapter 7 : Advanced Programming in the UNIX Environment, by W. Richard Stevens を参照ください。

Example:

    #include <setjmp.h>

    jmp_buf env;

    int main (void)
    {
        if (setjmp (env))
        {
            ... ハンドルエラー処理 ...
        }

        while (1)
        {
           ... メインプロセスのループ。この中のどこかから foo() を呼ぶ ...
        }
    }

    ...

    void foo (void)
    {
        ... blah, blah, blah ...

        if (err)
        {
            longjmp (env, 1);
        }
    }

Functions

int setjmp (jmp_buf __jmpb)
void longjmp (jmp_buf __jmpb, int __ret) __ATTR_NORETURN__

Function Documentation

void longjmp jmp_buf  __jmpb,
int  __ret
 

あらかじめ保存されたスタック状況へジャンプする Non-local jump to a saved stack context.

 #include <setjmp.h>

longjmp() は最後に呼ばれた setjmp() で保存された環境(jmpbが一致している必要がある)を復帰させます。 longjmp() 終了時、プログラムはあたかも 対応する setjmp() が返り値 __ret をもって帰ってきたかのような挙動を示します。

Note:
longjmp() は返す値として 0 を設定できません。第二引数に 0 を設定すると、1が返されます。
Parameters:
__jmpb あらかじめコールされた setjmp().でセットされた__jmpb
__ret setjmp().関数の返す値をセットする。
Returns:
longjmp()自体は何も返しません。※実行はsetjmp()の方に飛んでしまうので。

int setjmp jmp_buf  __jmpb  ) 
 

スタックを non-local goto (longjmp関数)のために保存します。

 #include <setjmp.h>

setjmp() 関数は、後に longjmp() 関数で使用するスタック環境を __jmpb に保存します。スタック環境は呼ばれた setjmp() から戻ってくるとき無効化されます。

Parameters:
__jmpb jmp_buf 型の値で、スタック情報を保存し、後に復帰されます。
Returns:
setjmp() は直接帰るときは 0 を返します。longjmp() から帰ってくるときは渡された値を持ち帰ります。


Automatically generated by Doxygen 1.4.1 on 23 Jan 2006.