C言語 ジャンプ処理 - setjmp.h - [ setjmp, longjmp ]

2008.09.08 Monday | by LRESULT


setjmp.hには、ジャンプ処理用のマクロが定義されています。

ジャンプ処理とは、その名の通りコード内を飛び回れます。
異なる関数間でも、goto文のように指定した位置へ移動します。
エラー処理に有効ですが、使いすぎると大変な事になりそうです。 


setjmp
書式 int setjmp( jmp_buf env )
機能 ジャンプ処理用に現在の環境を退避する
引数 jmp_buf env : 環境格納変数
( longjmp()での指定用 )
戻り値 最初に設定する際は、0を返し、
longjmp()から呼ばれた場合は、0以外の
longjump()で指定された引数を返します。



longjmp
書式 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文のように例外処理として使うかと思います。

カテゴリ:C言語 setjmp.h | 22:06 | comments(0) | trackbacks(0) | -


コメントする











この記事のトラックバックURL

http://simd.jugem.jp/trackback/37

トラックバック