union-Attribut
Die Gewerkschaft Schlüsselwort (keyword) in Funktionen auftritt, die sich auf diskriminierte Gewerkschaften beziehen.
/* 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
-
Gibt null oder mehr Attribute an, die für den Union-Typ gelten. Gültige Typattribute sind [handle], [transmit_as]; das Zeigerattribute [eindeutig], oder [ptr]; und die Nutzungsattribute [context_handle] und [ignorieren]. Gekapselte Unions können auch das [ref] -Zeigertyp-Attribut aufweisen. Trennen Sie mehrere Attribute durch Kommas.
-
Strukturname
-
Gibt ein optionales Tag an, das die vom MIDL-Compiler generierte Struktur benennt.
-
switch-type
-
Gibt einen int-, char-, Enumerationstyp oder einen Bezeichner an, der in einen dieser Typen aufgelöst wird.
-
switch-name
-
Gibt den Namen der Variablen vom Typ switch-type an, die als Union diskriminant fungiert.
-
union-name
-
Gibt einen optionalen Bezeichner an, der die Union in der vom MIDL-Compiler generierten Struktur benennt, die die Union und das Diskriminant enthält.
-
C-style-case-list
-
Liste der "caseconst-expr :"
-
limited-expression-list
-
Gibt mindestens einen C-Sprachausdruck an. Der MIDL-Compiler unterstützt bedingte Ausdrücke, logische Ausdrücke, relationale Ausdrücke und arithmetische Ausdrücke. MIDL lässt keine Funktionsaufrufe in Ausdrücken zu und lässt keine Inkrement- und Dekrementoperatoren zu. Einzelne Ausdrücke in der Liste sollten durch ein Komma getrennt werden.
-
field-attribute-list
-
Gibt null oder mehr Feldattribute an, die für das Union-Element gelten. Gültige Feldattribute sind [first_is], [last_is], [length_is], [max_is], [size_is]; die Verwendungsattribute [Zeichenfolge], [ignorieren] und [context_handle]; das Zeigerattribute [eindeutig] oder [ptr]; und für Mitglieder, bei denen es sich um nicht gekapselte Gewerkschaften handelt, das Union-Attribut [switch_type]. Nicht gekapselte Unions können auch das [ref] -Zeigerfeld-Attribut verwenden. Trennen Sie mehrere Feldattribute durch Kommas.
-
Typspezifizierer
-
Gibt einen Basistyp, eine Struktur, eine Union, einen Enumerationstyp oder einen Typbezeichner an. Eine optionale Speicherspezifikation kann dem Typbezeichner vorangestellt werden.
-
deklarator-list
-
Mindestens ein C-Standard-Deklarator, z. B. Bezeichner, Zeiger-Deklaratoren und Array-Deklaratoren. (Funktionsdeklaratoren und Bitfelddeklarationen sind in Unionen, die bei Remoteprozeduraufrufen übertragen werden, nicht zulässig. Außer wenn Sie den MIDL-Compilerschalter /osf verwenden, sind diese Deklaratoren in Unions zulässig, die nicht übertragen werden.) Trennen Sie mehrere Deklaratoren durch Kommas.
-
Etikett
-
Gibt ein optionales Tag an.
MIDL unterstützt zwei Arten von diskriminierten Gewerkschaften: gekapselte Undnicht gekapselte Gewerkschaften. Die gekapselte Union ist mit früheren Implementierungen von RPC (NCA Version 1) kompatibel. Die nicht gekapselte Union beseitigt einige der Einschränkungen der gekapselten Union und bietet eine sichtbarere Diskriminanz als die gekapselte Union.
Die gekapselte Union wird durch den Schalter Schlüsselwort (keyword) und das Fehlen anderer gewerkschaftsbezogener Schlüsselwörter identifiziert.
Die nicht gekapselte Union, auch als Union bezeichnet, wird durch das Vorhandensein der Schlüsselwörter [switch_is] und [switch_type] identifiziert, die das Diskriminant und seinen Typ identifizieren.
Wenn Sie [in, out] Unions verwenden, beachten Sie, dass das Ändern des Werts des Union-Schalters während des Anrufs dazu führen kann, dass sich der Remoteanruf anders verhält als ein lokaler Anruf. Bei der Rückgabe kopieren die Stubs den Parameter [in, out] in den Arbeitsspeicher, der bereits auf dem Client vorhanden ist. Wenn die Remoteprozedur den Wert des Union-Switches ändert und folglich die Größe des Datenobjekts ändert, können die Stubs gültigen Arbeitsspeicher mit dem Wert [out] überschreiben. Wenn der Union-Switch das Datenobjekt von einem Basistyp in einen Zeigertyp ändert, können die Stubs gültigen Arbeitsspeicher überschreiben, wenn sie den Zeigerreferent in den Speicherspeicherort kopieren, der durch den [in] -Wert eines Basistyps angegeben wird.
Die Form der Gewerkschaften muss plattformübergreifend identisch sein, um die Interkonnektivität zu gewährleisten.