#define DEFER(a, b, c) \ for (bool _flag = true; _flag; _flag = false) \ for (a; _flag && (b); c, _flag = false) int fun() { DEFER(FILE *f1 = fopen(...), (NULL != f1), mfclose(f1)) { DEFER(FILE *f2 = fopen(...), (NULL != f2), mfclose(f2)) { DEFER(FILE *f3 = fopen(...), (NULL != f3), mfclose(f3)) { ... do something ... } } } }
do foo(); _After bar(); /* exactly equivalent to (with gcc ({})s): */ ({ bar(); foo(); }); #define DEFER(a, b, c) \ _Let(a) if(!b) {} else do {c;} _After