Can't you just declare anonymous unions whenever? E.g.
struct foo { ... };
struct bar { ... };
struct bar check_this_out(struct foo foo) {
return ((union { struct foo foo; struct bar bar; }){ .foo = foo}).bar;
}
struct bar *also_this(struct foo *foo) {
union { struct foo foo; struct bar bar; } *tmp = (void*)foo;
return &tmp->bar;
}