- 论坛徽章:
- 1
|
【八仙过海,各显神通】大家把平时编程时用的技巧,都贴上来吧!
原帖由 "converse" 发表:
宏的运用还有更绝的,看看<<c语言接口与实现>;>;里的吧:
- #define TRY do { \
- volatile int Except_flag; \
- Except_Frame Except_frame; \
- Except_frame.prev = Except_stack; \
- Except_stack = &Except_frame; \
- Except_flag = setjmp(Except_frame.env); \
- if (Except_flag == Except_entered) {
- #define EXCEPT(e) \
- if (Except_flag == Except_entered) Except_stack = Except_stack->;prev; \
- } else if (Except_frame.exception == &(e)) { \
- Except_flag = Except_handled;
- #define ELSE \
- if (Except_flag == Except_entered) Except_stack = Except_stack->;prev; \
- } else { \
- Except_flag = Except_handled;
- #define FINALLY \
- if (Except_flag == Except_entered) Except_stack = Except_stack->;prev; \
- } { \
- if (Except_flag == Except_entered) \
- Except_flag = Except_finalized;
- #define END_TRY \
- if (Except_flag == Except_entered) Except_stack = Except_stack->;prev; \
- } if (Except_flag == Except_raised) RERAISE; \
- } while (0)
复制代码
这里太复杂,具体要看书才能看得比较清楚,我当时看了一个晚上才看懂,作者用这个宏实现了类似于c++的异常处理功能,实在令人惊叹!
而且在宏里使用的do {}while(0)技巧同样值得注意,比如说我们定义了一个宏如下:
- #define swap(x,y) {int temp = x; x = y; y = temp;}
复制代码
可是在用到这个宏的时候,我们经常这么用
,注意后面的;号,在把宏展开的时候就会出问题,可是如果我们这么写,就可以避免这个问题了:
- #define swap(x,y) \
- do {int temp = x; x = y; y = temp;} while(0)
复制代码
原来那个帖子我已经封了,大家就在这里回复吧! |
|