atributo union
A união palavra-chave aparece em funções relacionadas a uniões discriminadas.
/* 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;
]]
}
-
type-attribute-list
-
Especifica zero ou mais atributos que se aplicam ao tipo de união. Os atributos de tipo válidos incluem [handle], [transmit_as]; o atributo de ponteiro [unique], ou [ptr]; e os atributos de uso [context_handle] e [ignore]. Uniões encapsuladas também podem ter o atributo de tipo de ponteiro[ref]. Separe vários atributos com vírgulas.
-
struct-name
-
Especifica uma marca opcional que nomeia a estrutura gerada pelo compilador MIDL.
-
tipo de comutador
-
Especifica um tipo int, char, enum ou um identificador que é resolvido para um desses tipos.
-
switch-name
-
Especifica o nome da variável do tipo switch-type que atua como o discriminador de união.
-
union-name
-
Especifica um identificador opcional que nomeia a união na estrutura, gerada pelo compilador MIDL, que contém a união e o discriminador.
-
C-style-case-list
-
Lista de "caseconst-expr :"
-
limited-expression-list
-
Especifica uma ou mais expressões de linguagem C. O compilador MIDL dá suporte a expressões condicionais, expressões lógicas, expressões relacionais e expressões aritméticas. MIDL não permite invocações de função em expressões e não permite operadores de incremento e decremento. Expressões individuais na lista devem ser separadas por uma vírgula.
-
field-attribute-list
-
Especifica zero ou mais atributos de campo que se aplicam ao membro da união. Os atributos de campo válidos incluem [first_is], [last_is], [length_is], [max_is], [size_is]; os atributos de uso [string], [ignore]e [context_handle]; o atributo de ponteiro [exclusivo] ou [ptr]; e, para membros que são uniões não anátuladas, o atributo union [switch_type]. Uniões nonencapsuladas também podem usar o atributo de campo de ponteiro [ref] . Separe vários atributos de campo com vírgulas.
-
type-specifier
-
Especifica um tipo base, struct, união, tipo de enumeração ou identificador de tipo. Uma especificação de armazenamento opcional pode preceder o especificador de tipo.
-
declarator-list
-
Um ou mais declaradores C padrão, como identificadores, declaradores de ponteiro e declaradores de matriz. (Declaradores de função e declarações de campo de bit não são permitidos em uniões transmitidas em chamadas de procedimento remoto. Exceto quando você usa a opção /osf do compilador MIDL, esses declaradores são permitidos em uniões que não são transmitidas.) Separe vários declaradores com vírgulas.
-
tag
-
Especifica uma marca opcional.
A MIDL dá suporte a dois tipos de uniões discriminadas: uniões encapsuladas e uniões nãocapsuladas. A união encapsulada é compatível com implementações anteriores do RPC (NCA versão 1). A união não encapsulada elimina algumas das restrições da união encapsulada e fornece um discriminador mais visível do que a união encapsulada.
A união encapsulada é identificada pela opção palavra-chave e pela ausência de outras palavras-chave relacionadas à união.
A união não correspondente, também conhecida como união, é identificada pela presença das palavras-chave [switch_is] e [switch_type] , que identificam o discriminador e seu tipo.
Ao usar uniões [in, out] , lembre-se de que alterar o valor da troca de união durante a chamada pode fazer com que a chamada remota se comporte de forma diferente de uma chamada local. No retorno, os stubs copiam o parâmetro [in, out] na memória que já está presente no cliente. Quando o procedimento remoto modifica o valor da opção union e, consequentemente, altera o tamanho do objeto de dados, os stubs podem substituir a memória válida pelo valor [out] . Quando a opção união altera o objeto de dados de um tipo base para um tipo de ponteiro, os stubs podem substituir a memória válida quando copiam o referenciante de ponteiro para o local de memória indicado pelo valor [in] de um tipo base.
A forma de uniões deve ser idêntica entre plataformas para garantir a interconectividade.