3 ms·
Sure, you'd code like SCOPE(Resource *ptr = acquire_resource(), release_resource(ptr)) { // do stuff with resource ptr. } Actual
by jstimpfle 5y ago
Sure, you'd code like
SCOPE(Resource *ptr = acquire_resource(),
release_resource(ptr))
{
// do stuff with resource ptr.
}
Actually, to allow variable declarations in the init_stmt like above, you'll need to use two nested for-loops:
#define SCOPE_(name, begin_stmt, end_stmt) for (int name = 0; !name; assert(name && "should never break from a SCOPE")) for (begin_stmt; !name; name++, (end_stmt))
It is natural to add another layer of specific usage macro like this:
#define UI_NODE(ctx) SCOPE(push_ui_node(ctx), pop_ui_node(ctx))
UI_NODE(ctx)
{
ui_color(ctx, UI_COLOR_RED);
const char *items[3] = { "a", "b", "c" };
for (int i = 0; i < 3; i++)
{
UI_NODE(ctx)
ui_text(ctx, items[i]);
}
}
Naturally, if you're already on C++, better code these macros in terms of RAII instead of abusing for-loops. That will add a little robustness.
- okla 5y agoI'm on C89, but this is a very useful trick. Thanks!