Suppose the source text looked like this:
#includeunion urecord_t { char c; short s; long l; }; struct record_t { int type; #define RTYPE_CHAR 0 #define RTYPE_SHORT 1 #define RTYPE_LONG 2 urecord_t u; }; bool is_negative(record_t *r) { switch ( r->type ) { case RTYPE_CHAR: return r->u.c < 0; case RTYPE_SHORT: return r->u.s < 0; case RTYPE_LONG: return r->u.l < 0; } abort(); }
we have a disassembly like this:
Let's improve it with unions. First, let's define an union type. Since
Unions are a special case of structures, we open a structure window (menu
View|Structures), press Ins to create an union. Do not check "Create
Union"

We create the union members using the regular data definition commands. (press D repeatedly to define a field, N to rename it) we obtain :
urecord_t union ; (sizeof=0x4) chr
db ? shrt
dw ?
lng dd ?
urecord_t ends;
-----------------------------------
record_t struc ; (sizeof=0x8)
type dd ?
u urecord_t ?
record_t ends
Switching to the
disassembly window (or closing the enumeration window with Alt-F3), we
apply the defined structure through the Edit|Operand types|Struct offset
menu item and select the proper representation for the operand. In the
union type case, it may be necessary to select the desired union member
with the Edit|Structs|Select union member command. The final disassembly
looks like this:

That's all folks !