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;
]]
}
-
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.
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.