avr-libc  2.0.0
Standard C library for AVR-GCC

AVR Libc Home Page

AVRs

AVR Libc Development Pages

Main Page

User Manual

Library Reference

FAQ

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 
)

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

1 #include <setjmp.h>

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

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

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

1 #include <setjmp.h>

setjmp()は、あとで使用されるlongjmp()__jmpbのため、スタックコンテキスト/環境を保存します。setjmp()を呼び出した関数から戻ると、スタックコンテキストは無効になります。

引数
__jmpbjmp_buf型変数の環境を回復できるスタック情報
返値
setjmp()から直接戻るときは0を返し、保存したコンテキストを使いlongjmp()から戻るときは0以外を返します。