switch_is

typedef struct [ struct-tag ]
    [ switch_is(limited-expr) [ , field-attr-list ] ] union-type-specifier declarator;
    ...
}

[ [function-attribute-list] ] type-specifier [pointer-declarator] function-name(
    [ switch_is(limited-expr) [ , param-attr-list ] ] union-type [declarator]
    , ...
);

struct-tag

Specifies an optional tag for a structure.

limited-expr

Specifies a C-language expression supported by MIDL. Almost all C-language expressions are supported. The MIDL compiler supports conditional expressions, logical expressions, relational expressions, and arithmetic expressions. MIDL does not allow function invocations in expressions and does not allow pre- and post-increment and -decrement operators.

field-attr-list

Specifies zero or more field attributes that apply to a union member. Valid field attributes include first_is, last_is, length_is, max_is, size_is; the usage attributes string, ignore, and context_handle; the pointer attribute ref, unique, or ptr; and for members that are themselves unions, the union attribute switch_type. Separate multiple field attributes with commas.

union-type-specifier

Specifies the union type identifier. An optional storage specification can precede type-specifier.

declarator and declarator-list

Specifies a standard C declarator, such as an identifier, pointer declarator, and array declarator. (Function declarators and bit-field declarations are not allowed in unions that are transmitted in remote procedure calls. These declarators are allowed in unions that are not transmitted.) Separate multiple declarators with commas.

function-attribute-list

Specifies zero or more attributes that apply to the function. Valid function attributes are callback, local; the pointer attribute ref, unique, or ptr; and the usage attributes string, ignore, and context_handle.

type-specifier

Specifies a base_type, struct, union, enum type, or type identifier. An optional storage specification can precede type-specifier.

pointer-declarator

Specifies zero or more pointer declarators. A pointer declarator is the same as the pointer declarator used in C; it is constructed from the * designator, modifiers such as far, and the qualifier const.

function-name

Specifies the name of the remote procedure.

param-attr-list

Specifies zero or more attributes appropriate for the specified parameter type. Parameter attributes can take the directional attributes in and out, the field attributes first_is, last_is, length_is, max_is, size_is, and switch_type; the pointer attribute ref, unique, or ptr; and the usage attributes context_handle and string. The usage attribute ignore cannot be used as a parameter attribute. Separate multiple attributes with commas.

union-type

Identifies the union type specifier.

 

Examples

typedef [switch_type(short)] union _WILLIE_UNION_TYPE { 

    [case(24)]

        float fMays;

    [case(25)]

        double dMcCovey;

    [default]

        ;

} WILLIE_UNION_TYPE;

 

typedef struct _WINNER_TYPE { 

    [switch_is(sUniformNumber)] union WILLIE_UNION_TYPE w;

    short sUniformNumber;

} WINNER_TYPE;

 

Remarks

The switch_is attribute specifies the expression or identifier acting as the union discriminant that selects the union member. The discriminant associated with the switch_is attribute must be defined at the same logical level as the union:

    When the union is a parameter, the union discriminant must be another parameter.

    When the union is a field of a structure, the discriminant must be another field of the same structure.

 

The sequence in a structure or a function parameter list is not significant. The union can either precede or follow the discriminant.

The switch_is attribute can appear as a field attribute or as a parameter attribute.

See Also

encapsulated_union, non-encapsulated_union, switch_type, union