union 属性

联合关键字 (keyword) 出现在与可区分联合相关的函数中。

/* Encapsulated union*/
typedef [[ [type-attribute-list] ]] union [[ struct-name ]] switch (switch-type switch-name) [[ union-name ]] 
{
  C-style-case-list 
  [[ [ field-attribute-list <> ] ]] type-specifier <> declarator-list <>;

        ...
}

/* Non-encapsulated union*/
typedef [switch_type(switch-type) [[ , type-attr-list ]] ] union [[ tag ]] 
{ 
    [ case ( limited-expr-list) ]
  [[ [ field-attribute-list ] ]] type-specifier declarator-list;
  [[ [ default ]
  [[ [ field-attribute-list ] ]] type-specifier declarator-list;
  ]]
}

parameters

type-attribute-list

指定应用于联合类型的零个或多个属性。 有效的类型属性包括 [handle][transmit_as];指针属性 [unique],或 [ptr];和用法属性 [context_handle][ignore]。 封装的联合还可以具有 [ref] 指针类型属性。 用逗号分隔多个属性。

struct-name

指定一个可选标记,用于命名由 MIDL 编译器生成的结构。

switch-type

指定一个 intcharenum 类型或一个解析为这些类型之一的标识符。

switch-name

指定充当联合判别符的 switch-type 类型的变量的名称。

union-name

指定一个可选标识符,该标识符在结构中命名联合(由 MIDL 编译器生成),其中包含联合和判别器。

C-style-case-list

caseconst-expr :”列表

limited-expression-list

指定一个或多个 C 语言表达式。 MIDL 编译器支持条件表达式、逻辑表达式、关系表达式和算术表达式。 MIDL 不允许在表达式中调用函数,也不允许递增和递减运算符。 列表中的单个表达式应用逗号分隔。

field-attribute-list

指定应用于联合成员的零个或多个字段属性。 有效字段属性包括 [first_is][last_is][length_is][max_is][size_is];用法属性 [string][ignore][context_handle];指针属性 [unique][ptr];和,对于非封装联合的成员,联合属性 [switch_type]。 非封装联合也可以使用 [ref] 指针字段属性。 用逗号分隔多个字段属性。

type-specifier

指定 基类型结构联合枚举 类型或类型标识符。 可选的存储规范可以在 类型说明符之前。

declarator-list

一个或多个标准 C 声明符,例如标识符、指针声明符和数组声明符。 (在远程过程调用中传输的联合中不允许使用函数声明符和位字段声明。除非使用 MIDL 编译器开关 /osf,否则允许在未传输的联合中使用这些声明符。) 用逗号分隔多个声明符。

标签

指定可选标记。

备注

MIDL 支持两种类型的可歧视联合: 封装联合 和非 封装联合。 封装的联合与以前实现的 RPC (NCA 版本 1) 兼容。 非封装联合消除了封装联合的一些限制,并提供比封装的联合更明显的判别。

封装的联合由开关关键字 (keyword) 标识,并且缺少其他与联合相关的关键字。

非封装联合(也称为联合)由标识判别者及其类型的 [switch_is][switch_type] 关键字来标识。

使用 [inout] 联合时,请注意,在调用期间更改联合交换机的值会使远程呼叫的行为与本地呼叫不同。 返回时,存根将 [inout] 参数复制到客户端上已存在的内存中。 当远程过程修改联合开关的值并因此更改数据对象的大小时,存根可以使用 [out] 值覆盖有效内存。 当联合开关将数据对象从基类型更改为指针类型时,存根可以在将指针引用复制到基类型的 [in] 值指示的内存位置时覆盖有效内存。

联合的形状必须跨平台相同,以确保互连。

另请参阅

封装的联合

接口定义 (IDL) 文件

in

非封装联合

out

switch_is

switch_type