Union
Declares a union user defined type.
Syntax
`
Union typename
fieldname as datatype
Declare member function declaration ...
...
End Union
`
Parameters
`typename`
Name of the `Union`
`fieldname`
Name of a data field member
`member function declaration`
Any of the supported member functions
Description
Unions are similar to a `Type` structure, except that the elements of a union occupy the same space in memory (but unlike Type, Union can not contain variable-length strings, and more generally fields with constructors or destructors). The size of the Union is the size of the largest data item. A data item can be an unnamed `Type`. Since they occupy the same space, only a single element can be used.
Unions support member functions including `Constructor`, `Destructor`, `Function`, `Operator`, `Property` and `Sub`. All members of a union are public and access control is not supported.
Unnamed type nested inside a named union cannot have function members.
A `Union` can be passed as a user defined type to overloaded operator functions.
Example
`
' Example 1: bitfields.
Type unitType
Union
Dim attributeMask As UInteger
Type ' 32-bit uintegers can support up to 32 attributes.
isMilitary : 1 As UInteger
isMerchant : 1 As UInteger
End Type
End Union
End Type
Dim myunit As unitType
myunit.isMilitary = 1
myunit.isMerchant = 1
Print myunit.isMilitary ' Result: 1.
Print myunit.isMerchant ' Result: 1.
Print myunit.attributeMask ' Result: 3.
Sleep
' Example 2.
' Define our union.
Union AUnion
a As UByte
b As Integer
End Union
' Define a composite type.
Type CompType
s As String * 20
ui As Byte 'Flag to tell us what to use in union.
Union
au As UByte
bu As Integer
End Union
End Type
' Flags to let us know what to use in union.
' You can only use a single element of a union.
Const IsInteger = 1
Const IsUByte = 2
Dim MyUnion As AUnion
Dim MyComposite As CompType
' Can only set one value in union.
MyUnion.a = 128
MyComposite.s = "Type + Union"
MyComposite.ui = IsInteger ' Tells us this is an integer union.
MyComposite.bu = 1500
Print "Union: ";MyUnion.a
Print "Composite: ";
If MyComposite.ui = IsInteger Then
Print MyComposite.bu
ElseIf MyComposite.ui = IsUByte Then
Print MyComposite.au
Else
Print "Unknown type."
End If
Sleep
`
Dialect Differences

- Object-related features as functions defined inside the `Union` block are supported only in the -lang fb dialect.
- Not available in the -lang qb dialect unless referenced with the alias `__Union`.

Differences from QB

- New to FreeBASIC

See also

- `Type`