attributo union
La parola chiave union viene visualizzata nelle funzioni correlate alle unioni discriminate.
/* 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
-
Specifica zero o più attributi che si applicano al tipo di unione. Gli attributi di tipo validi includono [handle], [transmit_as]; l'attributo puntatore [unique], o [ptr]; e gli attributi di utilizzo [context_handle] e [ignore]. Le unioni incapsulate possono avere anche l'attributo di tipo puntatore [ref]. Separare più attributi con virgole.
-
struct-name
-
Specifica un tag facoltativo che denomina la struttura generata dal compilatore MIDL.
-
switch-type
-
Specifica un tipo int, char, enum o un identificatore che viene risolto in uno di questi tipi.
-
switch-name
-
Specifica il nome della variabile di tipo switch-type che funge da discriminante unione.
-
union-name
-
Specifica un identificatore facoltativo che denomina l'unione nella struttura, generata dal compilatore MIDL, che contiene l'unione e la discriminante.
-
C-style-case-list
-
Elenco di "caseconst-expr :"
-
limited-expression-list
-
Specifica una o più espressioni del linguaggio C. Il compilatore MIDL supporta espressioni condizionali, espressioni logiche, espressioni relazionali ed espressioni aritmetiche. MIDL non consente chiamate di funzione nelle espressioni e non consente operatori di incremento e decremento. Le singole espressioni nell'elenco devono essere separate da una virgola.
-
field-attribute-list
-
Specifica zero o più attributi di campo che si applicano al membro unione. Gli attributi di campo validi includono [first_is], [last_is], [length_is], [max_is], [size_is]; gli attributi di utilizzo [string], [ignore], e [context_handle]; l'attributo puntatore [unique] o [ptr]; e, per i membri che sono unioni non incapsulate, l'attributo union [switch_type]. Le unioni non incapsulate possono usare anche l'attributo del campo del puntatore [ref]. Separare più attributi di campo con virgole.
-
type-specifier
-
Specifica un tipo di base, uno struct, un'unione, un tipo di enumerazione o un identificatore di tipo. Una specifica di archiviazione facoltativa può precedere l'identificatore di tipo.
-
declarator-list
-
Uno o più dichiaratori C standard, ad esempio identificatori, dichiaratori di puntatore e dichiaratori di matrice. I dichiaratori di funzione e le dichiarazioni di campo di bit non sono consentiti nelle unioni trasmesse nelle chiamate di routine remote. Tranne quando si usa l'opzione /osf del compilatore MIDL, questi dichiaratori sono consentiti nelle unioni che non vengono trasmesse. Separare più dichiaratori con virgole.
-
tag
-
Specifica un tag facoltativo.
MIDL supporta due tipi di unioni discriminate: unioni incapsulate e unioni non incapsulate. L'unione incapsulata è compatibile con le implementazioni precedenti di RPC (NCA versione 1). L'unione non incapsulata elimina alcune delle restrizioni dell'unione incapsulata e fornisce una discriminante più visibile rispetto all'unione incapsulata.
L'unione incapsulata è identificata dalla parola chiave switch e dall'assenza di altre parole chiave correlate all'unione.
L'unione non incapsulata, nota anche come unione, è identificata dalla presenza delle parole chiave [switch_is] e [switch_type] che identificano la discriminante e il relativo tipo.
Quando si usano unioni [in, out] , tenere presente che la modifica del valore dell'opzione di unione durante la chiamata può comportare il comportamento della chiamata remota in modo diverso da una chiamata locale. In caso di restituzione, gli stub copiano il parametro [in, out] in memoria già presente nel client. Quando la routine remota modifica il valore dell'opzione di unione e di conseguenza modifica le dimensioni dell'oggetto dati, gli stub possono sovrascrivere la memoria valida con il valore [out]. Quando l'opzione unione modifica l'oggetto dati da un tipo di base a un tipo di puntatore, gli stub possono sovrascrivere la memoria valida quando copiano il referente del puntatore nella posizione di memoria indicata dal valore [in] di un tipo di base.
La forma delle unioni deve essere identica su più piattaforme per garantire l'interconnettività.