AVR Libc Home Page | ![]() |
AVR Libc Development Pages | ||
Main Page | FAQ | Library Reference | Additional Documentation | Example Projects |
C言語は goto ステートメントを忌み嫌ってきたため、goto 命令は同一のローカル関数内だけで使われることになっていました。他の(ローカルでない)関数にジャンプするためには、Cライブラリは関数 setjmp() 、longjmp() を提供しています。setjmp() 、 longjmp() はエラー取扱や割り込みやローレベル処理のサブルーチンなどに有用です。
longjmp() はグローバルレジスタ変数に対してなされた変更を破壊する可能性があります。(参照: How to permanently bind a variable to a register?).
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__ |
|
あらかじめ保存されたスタック状況へジャンプする Non-local jump to a saved stack context. #include <setjmp.h>
longjmp() は最後に呼ばれた setjmp() で保存された環境(jmpbが一致している必要がある)を復帰させます。
longjmp() 終了時、プログラムはあたかも 対応する setjmp() が返り値
|
|
スタックを non-local goto (longjmp関数)のために保存します。 #include <setjmp.h>
setjmp() 関数は、後に longjmp() 関数で使用するスタック環境を __jmpb に保存します。スタック環境は呼ばれた setjmp() から戻ってくるとき無効化されます。
|