3 ms·
Add: If you want an easier, and use shadowed variables: #define guard_name3(name, line) name ## line #define guard_name2(name, line) guard_name3(name,
by DudeInBasement 6y ago
Add:
If you want an easier, and use shadowed variables:
#define guard_name3(name, line) name ## line
#define guard_name2(name, line) guard_name3(name, line)
#define guard_line_name(name) guard_name2(name, __LINE__)
#define guard { void * defer_scope = &&guard_line_name(defer_scope ##_exe); \
if (0) { guard_line_name(defer_scope ##_exe) : defer_scope = 0; }\
if (defer_scope != 0)
#define guard_end goto * defer_scope; }
#define guard_break goto *defer_scope;
#define defer(func) void * guard_line_name(defer_scope_item) = defer_scope; \
defer_scope = &&guard_line_name(defer_scope_item##_label); \
if (0) { guard_line_name(defer_scope_item##_label): { func } goto * guard_line_name(defer_scope_item); }
guard {
void * p = malloc(10);
if (!p) guard_break;
defer({ printf("freep\n"); free(p);});
void * q = malloc(10);
if (!q) guard_break;
defer({printf("freeq\n"); free(q);});
void * fail = 0;
if (!fail) guard_break;
defer({printf("freefail\n"); free(fail);});
guard_end;
}