- 论坛徽章:
- 0
|
回复 21# BetonArmEE
# define c_defer_var(type, name, block) \
void name##_defer(type *name) \
{ \
block; \
} \
type name __attribute__ ((cleanup (name##_defer)))
# define c_defer \
auto void defer_func(); \
c_defer_var(int, __defer_scope_var__, (defer_func())) = 0; \
(void)__defer_scope_var__; \
void defer_func()
///////////////
/// 关键在于使用GNU C的扩展:对变量加cleanup属性
/// 然后,你在任何scope里面,里可以用defer了
/// 也可用对单一域的“析构函数”
int
test ()
{
c_defer_var(FILE *, f, fclose(*f)) = fopen(.........; /// 相当于析构
FILE *fp = fopen.....;
c_defer //// scope 的defer
{
fclose(fp);
....... some op .....
}
}
|
|