本篇就偷个懒吧,实在打不起精神。
1 #ifndef _TRY_THROW_CATCH_H_ 2 #define _TRY_THROW_CATCH_H_ 3 4 #include <stdio.h> 5 #include <setjmp.h> 6 7 /* For the full documentation and explanation of the code below, please refer to 8 * http://www.di.unipi.it/~nids/docs/longjump_try_trow_catch.html 9 */ 10 11 #define TRY do{ jmp_buf ex_buf__; switch( setjmp(ex_buf__) ){ case 0: while(1){ 12 #define CATCH(x) break; case x: 13 #define FINALLY break; } default: 14 #define ETRY } }while(0) 15 #define THROW(x) longjmp(ex_buf__, x) 16 17 #endif /*!_TRY_THROW_CATCH_H_*/
此代码的出处在这里(http://www.di.unipi.it/~nids/docs/longjump_try_trow_catch.html)
原文的意思,我感兴趣的有如下几点。
1. 这个try catch宏只是一个demo。实际可用的异常机制需要有运行时(Runtime)的支持。也就是说单纯的C语言是不能提供像C#、Java那样的异常捕获机制的。
2. 这个demo使用了setjmp.h里的setjmp(jmp_buf);和longjmp(jmp_buf, int);两个函数。这两个函数很特别。setjmp将当时的CPU状态存入jmp_buf,longjmp将jmp_buf中的内容恢复到CPU。