setjmpとlongjmpについて
エキスパート C プログラミングを読んでいたら
setjmpとlongjmpについて書かれていたので乗っていたサンプルプログラムを試してみました。
#include
#include
jmp_buf buf;
void banana()
{
printf( "in banana()\n" );
longjmp( buf, 1 );
/* NOTREACHED */
printf( "you'll never see this, because I longjmp'd" );
}
void main()
{
if( setjmp(buf) ){
printf( "back in main\n" );
}else{
printf( "first time through\n" );
banana();
}
}
実行結果は下記のようになります。
first time through
in banana()
back in main
longjmp関数からsetjmp関数の位置まで飛ぶため、"you'll never see this, because I longjmp'd"は表示されないようですね。
gotoでも同じことが出来るように見えますが、gotoは関数内部しか無理のところlongjmpは関数外にもjmpすることができるようです。
ただし、使用するとソースの可読性が一気に減るので使いどころが難しい関数のお話でした。