switch_is attribute
The [switch_is] attribute specifies the expression or identifier acting as the union discriminant that selects the union member.
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 pre- and post-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.
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.
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)] WILLIE_UNION_TYPE w;
short sUniformNumber;
} WINNER_TYPE;