Subj : Re: Why not unions To : comp.programming From : Rob Thorpe Date : Thu Jul 28 2005 02:12 am Alex Fraser wrote: > "Rob Thorpe" wrote in message > news:1122490853.570267.241310@f14g2000cwb.googlegroups.com... > [snip] > > In C there are two main uses of unions: > > 1. To save space by using a single location to store many types of > > data. > [snip] > > union bar { > > int x; > > double y; > > } > > struct foo { > > enum thing what_it_is; > > union bar b; > > } > > > > foo.what_it_is describes what is in the union b, it could have values > > DOUBLE or INT for example. > > > > It's only worth making this a union if we need the space. If we don't > > then we could use: > > > > struct foo { > > enum thing what_it_is; > > int x; > > double y; > > char *z; > > } > > > > Which is simpler and easier to check. > > Why do you think that? If all foos are initiated to a known state, say 0 in the x,y and z fields, then you can perform some checking on correctness of foo.what_it_is. If what_it_is says it's a double, but y is zero you know it's wrong. It can be harder if everything is in one pot, y is say 5.63322678e16 which may be correct, or maybe a mislabeled char *. To avoid the risk of mislabeling it's best to access these things indirectly anyway. > FWIW, I would generally use an "unnamed" (not sure if that is the correct > term) union type declared inside the struct: > > struct foo { > enum thing what_it_is; > union { > int x; > /* etc */ > } b; > }; That's also a good way to do it, but sometimes it's useful to have the union around to use by itself. .