The canonical method in C is to jump to a named label which hosts some functions to unwind/close any open descriptors or operations. As it involves the use of a goto statement, it drives certain people mad.
I wasn't aware of C Blocks.
I wasn't aware of C Blocks.
int main(){ __block int (^foo)(int x) = ^ int (int x) { if(x<100) return foo(x+10); return x; }; return foo(69); }
versus the GCC: int main(){ int foo(int x) { if(x<100) return foo(x+10); return x; }; return foo(69); }
if you want to see what I'm talking about.CLANG: http://pastebin.com/37A9by4V
GCC: http://pastebin.com/RMEDnwxi
However, defer does look interesting, and implementing it for GCC is very easy:
#define defer_(x) do{}while(0); \
auto void _dtor1_##x(); \
auto void _dtor2_##x(); \
int __attribute__((cleanup(_dtor2_##x))) _dtorV_##x=69; \
void _dtor2_##x(){if(_dtorV_##x==42)return _dtor1_##x();};_dtorV_##x=42; \
void _dtor1_##x()
#define defer__(x) defer_(x)
#define defer defer__(__COUNTER__)
You don't have to use the stupid block-syntax either, just: in = fopen("whatever", "r");
defer { fclose(in); } if (cond)
MACRO;
and the macro won't expand incorrectly to if (cond)
foo;
bar;
I personally just go the anal retentive route and use brackets everywhere.if(x){defer} will be wrong, but it'll be wrong in a different way.