AVR Libc Home Page AVRs AVR Libc Development Pages
Main Page User Manual Library Reference FAQ Alphabetical Index Example Projects

関数

<setjmp.h>: ローカル外 goto

関数

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

詳しい説明

C言語には、恐れられたgoto文がありますが、それは、同じ(ローカル)関数内のラベルにジャンプするために使うことが出来ます。別の(ローカル外の)関数に直接ジャンプするためには、Cライブラリは、setjmp()longjmp()関数を提供しています。 setjmp()longjmp() は、低レベルのサブルーチンプログラムにおいて、エラーや割込みが発生したときの処理に便利です。

注釈:
setjmp() および longjmp()は、理解やメンテナンスを難しくします。可能であれば、代わりの方法を使うべきです。
longjmp()は、グローバルレジスタ変数への変更を破壊することができます(変数を特定のレジスタに割り当てることができますか?をみてください)。

setjmp()/longjmp()のとても詳しい議論は、W. Richard StevensによるAdvanced Programming in the UNIX Environmentの7章を参照してください。

例:

    #include <setjmp.h>

    jmp_buf env;

    int main (void)
    {
        if (setjmp (env))
        {
            ... handle error ...
        }

        while (1)
        {
           ... main processing loop which calls foo() some where ...
        }
    }

    ...

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

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

関数ドキュメント

void longjmp ( jmp_buf  __jmpb,
int  __ret 
)

あらかじめ保存されたスタックコンテキストへのローカル外ジャンプ。

 #include <setjmp.h>

longjmp()は、__jmpbが一致する最後に呼び出されたsetjmp()の環境を復帰します。longjmp()が終了したあと、まるで__ret値を返し、対応するsetjmp()を呼び出したかのように、プログラムを実行します。

注釈:
longjmp()は、0を返すことは出来ません。もしlongjmp()の第2引数に0を与えると、代わりに1を返します。
パラメータ:
__jmpbsetjmp()の前回の呼出しで保存された情報
__retsetjmp()の呼出し元へ返す値
返値:
この関数は、永遠にreturnしません。
int setjmp ( jmp_buf  __jmpb )

ローカル外gotoのためにスタックコンテキストを保存します。

 #include <setjmp.h>

setjmp()は、あとで使用されるlongjmp()の__jmpbのため、スタックコンテキスト/環境を保存します。

パラメータ:
__jmpb環境を回復することが出来るスタック情報を持つ、jmp_buf変数型
返値:
setjmp()直接戻るときは0を返し、保存したコンテキストを使いlongjmp()から戻るときは0以外を返します。

Automatically generated by Doxygen 1.7.2 on Wed Feb 16 2011.

翻訳更新:2012年02月04日 by cega