Megosztás a következőn keresztül:


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<>