#include <stdio.h>
#define INIT_FOO(foo, i, d) \
{0}, * foo ## _init_ = init_foo(&foo, (i), (d))
#define DECLARE_FOO(foo, i, d) \
s_foo foo = INIT_FOO(foo, (i), (d))
typedef struct s_foo s_foo;
s_foo * init_foo(s_foo * foo, int i, double d);
struct s_foo {
int i;
double d;
};
int main(void) {
s_foo foo = INIT_FOO(foo, 42, 3.14159);
DECLARE_FOO(bar, 43, 4.14159);
int x;
printf("foo == { %d, %f }\n", foo.
i, foo.
d); printf("bar == { %d, %f }\n", bar.
i, bar.
d); return 0;
}
s_foo * init_foo(s_foo * foo, int i, double d) {
foo->i = i;
foo->d = d;
return foo;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgojZGVmaW5lIElOSVRfRk9PKGZvbywgaSwgZCkgXAogIHswfSwgKiBmb28gIyMgX2luaXRfID0gaW5pdF9mb28oJmZvbywgKGkpLCAoZCkpCgojZGVmaW5lIERFQ0xBUkVfRk9PKGZvbywgaSwgZCkgXAogIHNfZm9vIGZvbyA9IElOSVRfRk9PKGZvbywgKGkpLCAoZCkpCgp0eXBlZGVmIHN0cnVjdCBzX2ZvbyBzX2ZvbzsKCnNfZm9vICogaW5pdF9mb28oc19mb28gKiBmb28sIGludCBpLCBkb3VibGUgZCk7CgpzdHJ1Y3Qgc19mb28gewogICAgaW50IGk7CiAgICBkb3VibGUgZDsKICB9OwoKaW50IG1haW4odm9pZCkgewogICAgc19mb28gZm9vID0gSU5JVF9GT08oZm9vLCA0MiwgMy4xNDE1OSk7CiAgICBERUNMQVJFX0ZPTyhiYXIsIDQzLCA0LjE0MTU5KTsKICAgIGludCB4OwoKICAgIHByaW50ZigiZm9vID09IHsgJWQsICVmIH1cbiIsIGZvby5pLCBmb28uZCk7CiAgICBwcmludGYoImJhciA9PSB7ICVkLCAlZiB9XG4iLCBiYXIuaSwgYmFyLmQpOwogICAgcmV0dXJuIDA7CiAgfQoKc19mb28gKiBpbml0X2ZvbyhzX2ZvbyAqIGZvbywgaW50IGksIGRvdWJsZSBkKSB7CiAgICBmb28tPmkgPSBpOwogICAgZm9vLT5kID0gZDsKICAgIHJldHVybiBmb287CiAgfQ==