星期六, 7月 02, 2005

[C/C++]longjmp/setjmp

這是一組有趣的 api, 一般性的用法,是先使用 setjmp 設定 break point, 之後要跳回來的時候,就使用 longjmp.

所以,用法大概是這樣...
#include <stdio.h>
#include <setjmp.h>

jmp_buf setjmp_buffer;

int
main( int argc, char* argv[] )
{
if( setjmp( setjmp_buffer ) == 0 )
{
// do something
printf("longjmp!!\n");
longjmp( setjmp_buffer, 1 ); // 用 0 的話, setjmp() 就會收到 0, 那麼可能會無窮回圈
}
else
{
// do something
printf("after longjmp.\n");
}
}


很簡單吧,應該也可以兜出 try ... catch ... finally 的用法.
下面是我大致的想法
int exception_id;
if( ( exception_id = setjmp( setjmp_buffer ) ) == 0 ) // try
{
// do something
longjmp( setjmp_buffer, 1 ); // throw
}
else
{
if( exception_id == 1 ) // catch( 1 )
{
}
if( exception_id == 2 ) // catch( 2 )
{
}
// ....
}
// 之後,就是 finally...


之後再參考書看看吧... ^^

1 則留言:

levenshe 提到...

還是看不大懂setjmp的原理