Compartir a través de


atributo union

La palabra clave union aparece en funciones relacionadas con uniones 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;
  ]]
}

Parámetros

type-attribute-list

Especifica cero o más atributos que se aplican al tipo de unión. Los atributos de tipo válidos incluyen [handle], [transmit_as]; el atributo de puntero [unique], o [ptr]; y los atributos de uso [context_handle] y [ignore]. Las uniones encapsuladas también pueden tener el atributo de tipo de puntero [ref]. Separe varios atributos con comas.

struct-name

Especifica una etiqueta opcional que asigna un nombre a la estructura generada por el compilador MIDL.

switch-type

Especifica un tipo int, char, enum o un identificador que se resuelve en uno de estos tipos.

switch-name

Especifica el nombre de la variable de tipo switch-type que actúa como discriminante de unión.

union-name

Especifica un identificador opcional que asigna un nombre a la unión en la estructura, generada por el compilador MIDL, que contiene la unión y el discriminante.

C-style-case-list

Lista de "caseconst-expr :"

limited-expression-list

Especifica una o varias expresiones de lenguaje C. El compilador MIDL admite expresiones condicionales, expresiones lógicas, expresiones relacionales y expresiones aritméticas. MIDL no permite invocaciones de función en expresiones y no permite operadores de incremento y decremento. Las expresiones individuales de la lista deben estar separadas por una coma.

field-attribute-list

Especifica cero o más atributos de campo que se aplican al miembro de unión. Los atributos de campo válidos incluyen [first_is], [last_is], [length_is], [max_is], [size_is]; los atributos de uso [string], [ignore]y [context_handle]; el atributo de puntero [unique] o [ptr]; y, para los miembros que no están encapsulados, el atributo de unión [switch_type]. Las uniones no encapsuladas también pueden usar el atributo de campo de puntero [ref]. Separe varios atributos de campo con comas.

type-specifier

Especifica un tipo base, una estructura, una unión, un tipo de enumeración o un identificador de tipo. Una especificación de almacenamiento opcional puede preceder al especificador de tipos.

declarator-list

Uno o varios declaradores de C estándar, como identificadores, declaradores de puntero y declaradores de matriz. (Los declaradores de función y las declaraciones de campo de bits no se permiten en uniones que se transmiten en llamadas a procedimiento remoto. Excepto cuando se usa el modificador del compilador MIDL /osf, estos declaradores se permiten en uniones que no se transmiten). Separe varios declaradores con comas.

tag

Especifica una etiqueta opcional.

Comentarios

MIDL admite dos tipos de uniones discriminadas: uniones encapsuladas y uniones no encapsuladas. La unión encapsulada es compatible con las implementaciones anteriores de RPC (NCA versión 1). La unión no encapsulada elimina algunas de las restricciones de la unión encapsulada y proporciona un discriminador más visible que la unión encapsulada.

La unión encapsulada se identifica mediante la palabra clave switch y la ausencia de otras palabras clave relacionadas con la unión.

La unión no encapsulada, también conocida como unión, se identifica mediante la presencia de las palabras clave [switch_is] y [switch_type], que identifican el discriminante y su tipo.

Cuando use uniones [in, out], tenga en cuenta que cambiar el valor del modificador de unión durante la llamada puede hacer que la llamada remota se comporte de forma diferente a una llamada local. A cambio, los códigos auxiliares copian el parámetro [in, out] en la memoria que ya está presente en el cliente. Cuando el procedimiento remoto modifica el valor del modificador de unión y, por consiguiente, cambia el tamaño del objeto de datos, los códigos auxiliares pueden sobrescribir la memoria válida con el valor [out]. Cuando el modificador de unión cambia el objeto de datos de un tipo base a un tipo de puntero, los códigos auxiliares pueden sobrescribir la memoria válida cuando copian el puntero referente en la ubicación de memoria indicada por el valor [in] de un tipo base.

La forma de uniones debe ser idéntica entre plataformas para garantizar la interconectividad.

Consulte también

Uniones encapsuladas

Archivo de definición de interfaz (IDL)

En

Uniones no encapsuladas

out

switch_is

switch_type