- 1 名前:デフォルトの名無しさん [2005/08/11(木) 11:18:15 ]
- 前スレ pc8.2ch.net/test/read.cgi/tech/1021364372/
- 735 名前:デフォルトの名無しさん [2008/02/17(日) 03:32:45 ]
- >>719 でけた。TRY〜END_TRYの中からreturn出来ないけど。
typedef struct ex_handler_rec_ ex_handler_rec_; struct ex_handler_rec_ { ex_handler_rec_ *volatile prev_; jmp_buf jbuf_; const char *volatile ex_type_; void *volatile ex_data_; }; ex_handler_rec_ *volatile current_handler_ = NULL; #define EX_ABBREV(x) x #define TRY { \ ex_handler_rec_ EX_ABBREV(ex_handler_); \ int EX_ABBREV(need_rethrow_) = 0; \ if (0) BREAK_TRY; /* mandate finally clause */ \ EX_ABBREV(ex_handler_).prev_ = current_handler_; \ current_handler_ = &EX_ABBREV(ex_handler_); \ if (setjmp(EX_ABBREV(ex_handler_).jbuf_) == 0) { #define BREAK_TRY goto EX_ABBREV(break_entry_) #define RETHROW goto EX_ABBREV(rethrow_entry_) #define CATCH(extype) \ } else if (!extype || !strcmp(extype, EX_ABBREV(ex_handler_).ex_type_)) { \ void *EX_ABBREV(ex_data) = EX_ABBREV(ex_handler_).ex_data_; #define CATCH_ALL \ } else if (1) { \ void *EX_ABBREV(ex_data) = EX_ABBREV(ex_handler_).ex_data_;
- 736 名前:デフォルトの名無しさん [2008/02/17(日) 03:33:37 ]
- #define FINALLY \
} else { \ if (0) goto EX_ABBREV(rethrow_entry_); /* supress warning */ \ EX_ABBREV(rethrow_entry_): \ EX_ABBREV(need_rethrow_) = 1; \ } \ EX_ABBREV(break_entry_):; \ if (current_handler_ == &EX_ABBREV(ex_handler_)) /* no exception */ \ current_handler_ = EX_ABBREV(ex_handler_).prev_; \ { #define END_TRY } \ if (EX_ABBREV(need_rethrow_)) \ throw_exception(EX_ABBREV(ex_handler_).ex_type_, EX_ABBREV(ex_handler_).ex_data_); \ } void throw_exception(const char *ex_type, void *ex_data) { ex_handler_rec_ *handler = current_handler_; current_handler_ = handler->prev_; handler->ex_type_ = ex_type; handler->ex_data_ = ex_data; printf("throw_exception %s\n", ex_type); longjmp(handler->jbuf_, 1); }
|

|