- 论坛徽章:
- 1
|
本帖最后由 群雄逐鹿中原 于 2010-02-04 01:55 编辑
回复 群雄逐鹿中原
没…… 还是有用错的地方…… 严格的说…… 侵入式的签名中, 应该是:
void f( . ...
OwnWaterloo 发表于 2010-02-04 00:56 ![]()
用第二个直接g_top传递,没有问题的。
拿你的代码改了一个 - #include <setjmp.h>
- #include <stdio.h>
- struct try_env
- {
- jmp_buf env;
- int err;
- struct try_env *next;
- } *g_try_top;
- #define TRY(try_env) if \
- ( \
- try_env.next = g_try_top, \
- g_try_top = &try_env, \
- ( g_try_top->err = setjmp( g_try_top->env ) ) == 0 \
- )
- #define CATCH() else if( g_try_top = g_try_top->next , 1 )
- #define THROW(err) longjmp( g_try_top->env, ( err ) )
- void func( )
- {
- THROW( __LINE__ );
- }
- int main( )
- {
- struct try_env env0;
- TRY( env0 )
- {
- struct try_env env1;
- TRY( env1 )
- {
- func( );
- }
- CATCH( )
- {
- printf( "Catch err1 = %d\n", env1.err );
- THROW( env1.err * 2 );
- }
- }
- CATCH( )
- {
- printf( "Catch err0 = %d\n", env0.err );
- }
-
- return 0;
- }
复制代码 |
|