#include <stdio.h>
typedef struct
{
int a;
int b;
} MyStruct;
typedef struct
{
MyStruct s;
int a;
} OuterStruct;
#define MyStruct_Defaults(...) {.a = 42, .b = 37, __VA_ARGS__}
#define MyStruct_ClDefaults(...) (MyStruct) MyStruct_Defaults(__VA_ARGS__)
#define OuterStruct_Defaults(...) {.s = MyStruct_Defaults(), .a = 99, __VA_ARGS__}
#define OuterStruct_ClDefaults(...) (OuterStruct) OuterStruct_Defaults(__VA_ARGS__)
void print_v(MyStruct s);
void print_p(MyStruct const * const s);
MyStruct gs = MyStruct_Defaults();
int main(void) {
printf("gs.a: %d gs.b: %d\n", gs.
a, gs.
b);
MyStruct s1 = MyStruct_ClDefaults();
printf("s1.a: %d s1.b: %d\n", s1.
a, s1.
b);
MyStruct s2 = MyStruct_ClDefaults(.a = 15, .b = 33);
printf("s2.a: %d s2.b: %d\n", s2.
a, s2.
b);
OuterStruct S = OuterStruct_ClDefaults(.s = MyStruct_ClDefaults(.a = 16, .b = 29));
printf(" S.a: %d S.b: %d\n", S.
s.
a, S.
s.
b);
print_v(MyStruct_ClDefaults(.b = 11));
print_p(&MyStruct_ClDefaults(.a = 12));
return 0;
}
void print_v(MyStruct s)
{
printf("vs.a: %d vs.b: %d\n", s.
a, s.
b); }
void print_p(MyStruct const * const s)
{
printf("ps.a: %d ps.b: %d\n", s
->a
, s
->b
); }
I2luY2x1ZGUgPHN0ZGlvLmg+Cgp0eXBlZGVmIHN0cnVjdAp7CglpbnQgYTsKCWludCBiOwp9IE15U3RydWN0OwoKdHlwZWRlZiBzdHJ1Y3QKewoJTXlTdHJ1Y3QgczsKCWludCBhOwp9IE91dGVyU3RydWN0OwoKI2RlZmluZSBNeVN0cnVjdF9EZWZhdWx0cyguLi4pIHsuYSA9IDQyLCAuYiA9IDM3LCBfX1ZBX0FSR1NfX30KI2RlZmluZSBNeVN0cnVjdF9DbERlZmF1bHRzKC4uLikgKE15U3RydWN0KSBNeVN0cnVjdF9EZWZhdWx0cyhfX1ZBX0FSR1NfXykKCiNkZWZpbmUgT3V0ZXJTdHJ1Y3RfRGVmYXVsdHMoLi4uKSB7LnMgPSBNeVN0cnVjdF9EZWZhdWx0cygpLCAuYSA9IDk5LCBfX1ZBX0FSR1NfX30KI2RlZmluZSBPdXRlclN0cnVjdF9DbERlZmF1bHRzKC4uLikgKE91dGVyU3RydWN0KSBPdXRlclN0cnVjdF9EZWZhdWx0cyhfX1ZBX0FSR1NfXykKCnZvaWQgcHJpbnRfdihNeVN0cnVjdCBzKTsKdm9pZCBwcmludF9wKE15U3RydWN0IGNvbnN0ICogY29uc3Qgcyk7CgpNeVN0cnVjdCBncyA9IE15U3RydWN0X0RlZmF1bHRzKCk7CgppbnQgbWFpbih2b2lkKSB7CglwcmludGYoImdzLmE6ICVkICAgIGdzLmI6ICVkXG4iLCBncy5hLCBncy5iKTsKCglNeVN0cnVjdCBzMSA9IE15U3RydWN0X0NsRGVmYXVsdHMoKTsKCXByaW50ZigiczEuYTogJWQgICAgczEuYjogJWRcbiIsIHMxLmEsIHMxLmIpOwoKCU15U3RydWN0IHMyID0gTXlTdHJ1Y3RfQ2xEZWZhdWx0cyguYSA9IDE1LCAuYiA9IDMzKTsKCXByaW50ZigiczIuYTogJWQgICAgczIuYjogJWRcbiIsIHMyLmEsIHMyLmIpOwoKCU91dGVyU3RydWN0IFMgPSBPdXRlclN0cnVjdF9DbERlZmF1bHRzKC5zID0gTXlTdHJ1Y3RfQ2xEZWZhdWx0cyguYSA9IDE2LCAuYiA9IDI5KSk7CglwcmludGYoIiBTLmE6ICVkICAgICBTLmI6ICVkXG4iLCBTLnMuYSwgUy5zLmIpOwoKCXByaW50X3YoTXlTdHJ1Y3RfQ2xEZWZhdWx0cyguYiA9IDExKSk7CglwcmludF9wKCZNeVN0cnVjdF9DbERlZmF1bHRzKC5hID0gMTIpKTsKCglyZXR1cm4gMDsKfQoKdm9pZCBwcmludF92KE15U3RydWN0IHMpCnsKCXByaW50ZigidnMuYTogJWQgICAgdnMuYjogJWRcbiIsIHMuYSwgcy5iKTsKfQoKdm9pZCBwcmludF9wKE15U3RydWN0IGNvbnN0ICogY29uc3QgcykKewoJcHJpbnRmKCJwcy5hOiAlZCAgICBwcy5iOiAlZFxuIiwgcy0+YSwgcy0+Yik7Cn0K