#include #define dynamic_struct_name(type, name) \ __dynamic_ ## type ## _ ## name ## _struct__ \ #define dynamic_cleanup_name(type, name) \ __dynamic_ ## type ## _ ## name ## _cleanup__ \ #define dynamic_save_name(name) \ __dynamic_ ## name ## _save__ \ #define dynamic_continue_name(name) \ __dynamic_ ## name ## _continue__ \ #define dynamic_struct_def(type, name) \ typedef struct { \ type * target; \ type data; \ } dynamic_struct_name(type, name) \ #define dynamic_cleanup_def(type, name) \ void dynamic_cleanup_name(type, name) \ (dynamic_struct_name(type, name) * arg) { \ *(*arg).target = (*arg).data; \ } \ #define dynamic_var(type, name, value) \ dynamic_struct_def(type, name); \ dynamic_cleanup_def(type, name); \ type name = value \ #define dynamic_bind_aux(type, name, value, stype, save, pop, var) \ for(int var = 1; var;) \ for(stype save __attribute__((cleanup(pop))) = {&name, name}; var;) \ for(name = value; var; var = 0) \ #define dynamic_bind(type, name, value) \ dynamic_bind_aux(type, name, value, \ dynamic_struct_name(type, name), \ dynamic_save_name(name), \ dynamic_cleanup_name(type, name), \ dynamic_continue_name(name)) \ dynamic_var(int, x, 5); int bar() { printf("We are in bar, x = %d\n", x); return x; } int foo() { dynamic_bind(int, x, 42) { printf("bar(): %d\n", bar()); x = 222; return bar(); } } int main(int argc, char** argv) { printf("bar(): %d\n", bar()); printf("foo(): %d\n", foo()); printf("bar(): %d\n", bar()); return 0; }