Union

FreeBASIC

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.
Like Type, Union can use the optional Field = number specifier and supports also inheritance through the use of the Extends keyword.
Unlike Type, Union can not contain variable-length strings, and more generally fields (or can not have bases) 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.

Nested unnamed type or union cannot have procedure members or static data members (same restriction for local named type/union).

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