C言語 ジャンプ処理 - setjmp.h - [ setjmp, longjmp ]
2008.09.08 Monday | by LRESULT
setjmp.hには、ジャンプ処理用のマクロが定義されています。
ジャンプ処理とは、その名の通りコード内を飛び回れます。
異なる関数間でも、goto文のように指定した位置へ移動します。
エラー処理に有効ですが、使いすぎると大変な事になりそうです。
書式 | int setjmp( jmp_buf env ) |
---|---|
機能 | ジャンプ処理用に現在の環境を退避する |
引数 | jmp_buf env : 環境格納変数 ( longjmp()での指定用 ) |
戻り値 | 最初に設定する際は、0を返し、 longjmp()から呼ばれた場合は、0以外の longjump()で指定された引数を返します。 |
書式 | void longjmp( jmp_buf env, int value ) |
---|---|
機能 | 指定された位置にジャンプする |
引数 | jmp_buf env : setjmp()で取得した環境格納変数 int value : setjmp()の戻り値を設定 |
戻り値 | なし |
setjmp()とlongjmp()を使用したジャンプ処理でループさせてみます。 |
---|
#include <stdio.h> #include <setjmp.h> jmp_buf env; void main(void) { int i = 0; int ret = setjmp( env ); if( ret == 0 ){ printf( "1回目は素通り¥n" ); } else if( 0 < ret && ret < 8 ){ printf( "longjmp()からジャンプして来た[%d回目]¥n", i+1 ); } else{ printf( "10回目で終わり¥n" ); return; } longjmp( env, i++ ); } |
1回目は素通り longjmp()からジャンプして来た[2回目] longjmp()からジャンプして来た[3回目] longjmp()からジャンプして来た[4回目] longjmp()からジャンプして来た[5回目] longjmp()からジャンプして来た[6回目] longjmp()からジャンプして来た[7回目] longjmp()からジャンプして来た[8回目] longjmp()からジャンプして来た[9回目] 10回目で終わり |
---|
と、いうわけで、longjmp()で指定した戻り値を使って ループ処理を行いました。 最後のreturnを忘れると無限ループになるのでお気をつけて。 通常は、goto文のように例外処理として使うかと思います。 |