deem@interlan.UUCP (Mike Deem) (11/11/87)
Here is another "I'd like to be able to do this in C" suggestion.
There are times I would like to be able to say:
s.a = 4321;
.
.
.
s.b = 123.4;
where a and b occupy the same memory but s is a structure and has other feilds,
say c and d, that could be accessed by:
s.c
and
s.d
I think this could be declared something like:
struct {
int c; /* c takes up space */
union { /* no identifier */
int a; /* both a and b are in the same space and */
float b; /* that space follows c's */
}; /* no identified here either */
char d; /* d takes space following the a b space */
} s;
I know I could give the union a name, say u, and write:
s.u.a
but when s u and a are replaced with "meaningful" identifiers or many
structures are nested, things get to long.rst@think.COM (Robert Thau) (11/12/87)
In article <511@interlan.UUCP> deem@interlan.UUCP (Mike Deem) writes: >I think this could be declared something like: > > struct { > int c; /* c takes up space */ > union { /* no identifier */ > int a; /* both a and b are in the same space and */ > float b; /* that space follows c's */ > }; /* no identified here either */ > char d; /* d takes space following the a b space */ > } s; "Fixed in C++", which supports exactly this syntax. In plain C, there is no way to suppress the name of the union entirely, so the typical thing is to hide it with a little preprocessor skullduggery. For example, struct s { int c; /* c takes up space */ union { int A; /* both a and b are in the same space and */ float B; /* that space follows c's */ } u; char d; /* d takes space following the a b space */ }; #define a u.A #define b u.B main() { struct s s; printf("&s.a = %d, &s.b = %d, &s.c = %d, &s.d=%d\n", (int)&s.a, (int)&s.b, (int)&s.c, (int)&s.d); } on a Sun-3 (where pointers fit in ints) produces the output: &s.a = 251657764, &s.b = 251657764, &s.c = 251657760, &s.d=251657768 which shows that a and b do in fact have the same address. rst