RPC-szakszervezetek
A beágyazott és a nem beágyazott szakszervezetek közös union_arm_selector<> formátumot használnak:
union_arms<2>
arm1_case_value<4> offset_to_arm_description<2>
..
armN_case_value<4> offset_to_arm_description<2>
default_arm_description<2>
A union_arms<2> mező két részből áll. Ha az egyesítés MIDL 1.0 stílusú egyesítés, a felső 4 bit tartalmazza az egyesítő kar igazítását (a legnagyobb igazított kar igazítását). Ellenkező esetben a felső 4 bit nulla. Az alsó 12 bit tartalmazza a karok számát az unióban. Más szóval:
alignment<highest nibble> arm_counter<three lower nibbles>
A offset_to_arm_description<2> mező a kar típusleírásának relatív aláírt eltolását tartalmazza. A mező azonban túlterhelt az egyszerű típusok optimalizálásával. Ezeknél az eltolási mező felső bájtja FC_MAGIC_UNION_BYTE (0x80), a rövid alsó bájtja pedig a kar tényleges formátumkartípusa. A "80 xx" eltolásértéknek két tartománya van: az xx típusformátum-sztring; és minden más tartományon belül (80 FF .. 7f FF) azt jelenti, tényleges eltolás. Ez a 80 00 <tartomány eltolásait teszi lehetővé. 80 FF > eltolásként nem érhető el. A fordító ezt az 5.1.164-es MIDL-verziótól ellenőrzi.
A default_arm_description<2> mező az alapértelmezett kar egyesítő karjának típusát jelzi, ha van ilyen. Ha nincs megadva alapértelmezett kar az egyesítéshez, akkor a default_arm_description<2> mező 0xFFFF, és kivétel keletkezik, ha a switch_is érték nem egyezik meg a kar esetértékeivel. Ha az alapértelmezett kar van megadva, de üres, akkor a default_arm_description<2> mező nulla. Ellenkező esetben a default_arm_description<2> mező szemantikája megegyezik a offset_to_arm_description<2> mezővel.
Az alábbiakban összefoglaljuk az alábbiakat:
- 0 – alapértelmezett üres
- FFFF – nincs alapértelmezett
- 80xx - egyszerű típus
- egyéb – relatív eltolás
Beágyazott uniók
A beágyazott egyesítések az IDL speciális egyesítési szintaxisából származnak. A beágyazott egyesítés tulajdonképpen egy kötegstruktúra, amelynek elején diszkrimináns mező található, az unió pedig az egyetlen tag.
FC_ENCAPSULATED_UNION switch_type<1>
memory_size<2>
union_arm_selector<>
A beágyazott egyesítés switch_type<1> mező két részből áll. Az alsó nibble biztosítja a tényleges kapcsolótípust, a felső nibble pedig a memória növekményét biztosítja, hogy a memóriamutatót a switch_is mezőn átugorja, ami magában foglalja a csonk által létrehozott struktúra switch_is() mezője és a tényleges egyesítő mező közötti párnázást.
A memory_size<2> mező csak az unió mérete, és megegyezik a nem beágyazott szakszervezetekkel. Az egyesítést tartalmazó struktúra teljes méretének lekéréséhez adja hozzá a memory_size<2> a memória növekményéhez, hogy továbblépjen, azaz a switch_type<1> mező felső részén, majd igazítsa a növekménynek megfelelő igazítással.
Nemcapsulated Unions
A nemcapulált egyesítések olyan tipikus helyzetek, amikor az egyesítés egy argumentum vagy mező, a kapcsoló pedig egy másik argumentum vagy mező.
FC_NON_ENCAPSULATED_UNION switch_type<1>
switch_is_description<>
offset_to_size_and_arm_description<2>
Hol:
Az switch_type<1> mező a diszkrimináns formátuma.
A switch_is_descriptor<> mező korrelációs leíró, és 4 vagy 6 bájtból áll attól függően, hogy /robusztus van-e használva. A switch_is_description<>esetében azonban, ha az egyesítés egy struktúrába van beágyazva, a switch_is_description<> eltolása az switch_is mező eltolása a szerkezetben elfoglalt pozícióból (nem a szerkezet elejéről).
A offset_to_size_and_arm_description<2> mező eltolást ad az unió méretének és karjának leírásához, amely megegyezik a beágyazott egyesítőkével, és minden azonos típusú nem összefoglalt unió meg van osztva:
memory_size<2>
union_arm_selector<>