##Primary Way
#define str_mk(name, ...) _##name; struct { char __VA_ARGS__; } name; char __##name
#define _(name, ...) char str_mk(name, ##__VA_ARGS__);
#define __(name, ...) str_mk(name, ##__VA_ARGS__)
#define ___(name, ...) str_mk(name, ##__VA_ARGS__)
#define ____(name) str_mk(name, dummy)
_(OTTDefaultTweakLib,
__(CommonAnimations,
___(Appear,
____(Duration),
____(Damping)
),
___(Disappear,
____(Duration),
____(Damping)
)
),
__(Network,
___(Trains,
____(Host)
),
___(Avia,
____(TestPurchase),
____(NonProdData)
)
)
)
#undef str_mk
#undef _
#undef __
#undef ___
#undef ____
##Alternative Way
#define struct_prefix(name) struct {} name##_; struct
#define lib(name) struct_prefix(name)
#define cat(name) struct_prefix(name)
#define col(name) struct_prefix(name)
#define ___(name) name;
#define tweak(name) void *name##_, *name;
lib(OTTDefaultTweakLib)
{
cat(CommonAnimations)
{
col(Appear)
{
tweak(Duration)
}
___(Appear)
}
___(CommonAnimations)
cat(MenuScreen)
{
col(Buttons)
{
tweak(isHidden)
tweak(animated)
tweak(wat)
}
___(Buttons)
}
___(MenuScreen)
cat(
}
___(OTTDefaultTweakLib)
#undef lib
#undef cat
#undef col
#undef ___
#undef tweak