#include #include struct save_rec { void *p; /* where */ void *v; /* saved value */ size_t sz; /* size of value */ }; void restore (void *s_) { struct save_rec *s = s_; memcpy (s->p, s->v, s->sz); } #define bind(var,val) \ for (struct { \ struct save_rec r; \ int k; \ __typeof__(var) old; \ } rec##__LINE__ \ __attribute__ ((cleanup (restore))) \ = { { &var, &rec##__LINE__.old, sizeof (var) }, 0, var }; \ (rec##__LINE__.k < 1) ? ((var = (val)), 1) : 0; \ rec##__LINE__.k++) /* Demo */ int xyz = 0; void bar (void); void baz (void); void foo (void) { bind (xyz, 42) bar (); } void bar (void) { printf ("bar: xyz = %d\n", xyz); bind (xyz, 99) baz (); printf ("back in bar: xyz = %d\n", xyz); } void baz (void) { printf ("baz: xyz = %d\n", xyz); } int main (int argc, char **argv) { foo (); printf ("main: xyz = %d\n", xyz); return 0; }