Union type

IDL also supports a union type, which is a cross between the C union and switch statements. The syntax of a union type declaration is as follows: union identifier switch ( switch-type )
{ case+ }

The "identifier" following the union keyword defines a new legal type. (Union types may also be named using a typedef declaration.) The "switch-type" specifies an integral, character, boolean, or enumeration type, or the name of a previously defined integral, boolean, character, or enumeration type. Each "case" of the union is specified with the following syntax:

case-label+ type-spec declarator ;

where "type-spec" is any valid type specification; "declarator" is an identifier, an array declarator (such as, foo[3][5]), or a pointer declarator (such as, *foo); and each "case-label" has one of the following forms:

case const-expr:
default:

The "const-expr" is a constant expression that must match or be automatically castable to the "switch-type". A default case can appear no more than once.

Unions are mapped onto C/C++ structs. For example, the following IDL declaration:

   union Foo switch (long) {
     case 1: long x;
     case 2: float y;
     default: char z;
   };

is mapped onto the following C struct:

   typedef Hello_struct {
     long _d;
     union {
       long x;
       float y;
       char z;
     } _u;
   } Hello_foo;

The discriminator is referred to as "_d", and the union in the struct is referred to as "_u". Hence, elements of the union are referenced just as in C:

   Foo v;

   /* get a pointer to Foo in v: */
   switch(v->_d) {
     case 1: printf("x = %ld\n", v->_u.x); break;
     case 2: printf("y = %f\n", v->_u.y); break;
     default: printf("z = %c\n", v->_u.z); break;
   }

Note: This example is from The Common Object Request Broker: Architecture and Specification, revision 1.1, page 90.


[Back: Constructed types]
[Next: Template types (sequences and strings)]