Say I have the following types:
typedef struct TYPEA
{
int type;
char[12] id;
} TYPEA;
typedef struct TYPEB
{
int type;
int value;
} TYPEB;
I want to use create a union of these types and 'int', so that I can access the "type" int without needing to know whether TYPEA or TYPEB is stored in the union (the value of int lets me determine which is actually stored there). I can't get the right syntax though.
My union:
typedef union MEMBER
{
int type;
struct TYPEA a;
struct TYPEB b;
} MEMBER;
The union is accessed via:
typedef struct WRAPPER
{
union MEMBER* member;
struct WRAPPER* next;
} WRAPPER;
Questions:
w->member->a.id
gives "request for member 'id' in something not a structure or union.Thanks.
A structure can be nested inside a union and it is called union of structures. It is possible to create a union inside a structure.
A union is an object similar to a structure except that all of its members start at the same location in memory. A union variable can represent the value of only one of its members at a time. In C++, structures and unions are the same as classes except that their members and inheritance are public by default.
w->member->type
.union
specifically.One note that may be a point of misunderstanding is that the union
holds EITHER the int
, or TYPEA
, or TYPEB
, so in particular you cannot rely on your int type;
in the union to tell you which struct
the union holds.
Edit to respond to question in comments:
You probably want something like this:
struct TYPEA {
char data[30]; // or whatever
};
struct TYPEB {
double x, y; // or whatever
};
struct some_info {
int type; // set accordingly
union {
struct TYPEA a;
struct TYPEB b;
} data; // access with some_info_object.data.a or some_info_object.data.b
};
member
field as a pointer, so you should use
w->member->type
instead of w->member.type
.malloc
the union type. When you allocate a union, you'll get a structure that has a sizeof
equal to the largest element in the union. If you try to copy structures into union pointers, you'll mess up the alignment.If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With