union kulcsszó (RPC)
A C nyelv egyes funkciói, például a szakszervezetek speciális MIDL-kulcsszavakat igényelnek a távoli eljáráshívásokban való használatuk támogatásához. A C nyelv egyesítője egy változó, amely különböző típusú és méretű objektumokat tartalmaz. A fejlesztő általában létrehoz egy változót, amely nyomon követi az egyesítőben tárolt típusokat. Az elosztott környezetben való helyes működéshez a egyesítés típusát jelző változónak vagy a megkülönböztetőis elérhetőnek kell lennie a távoli számítógép számára. A MIDL a [switch_type] és a [switch_is] kulcsszavakat biztosítja a megkülönböztető típus és a név azonosításához.
A MIDL megköveteli, hogy a diszkriminánst az unióval két módon továbbítsa:
- A egyesítést és a megkülönböztetőt paraméterként kell megadni.
- Az uniót és a diszkriminánst egy struktúrába kell csomagolni.
A megkülönböztetett szakszervezetek két alapvető típusát biztosítja a MIDL: nonencapsulated_union és encapsulated_union. A nemcapsulated union megkülönböztetése egy másik paraméter, ha az egyesítés paraméter. Ez egy másik mező, ha az egyesítés egy struktúra mezője. A beágyazott egyesítés definíciója olyan struktúradefinícióvá alakul, amelynek első mezője a megkülönböztető, a második és az utolsó mező pedig az egyesítés. Az alábbi példa bemutatja, hogyan biztosíthatja a egyesítést és a különbséget paraméterekként:
typedef [switch_type(short)] union
{
[case(0)] short sVal;
[case(1)] float fVal;
[case(2)] char chVal;
[default] ;
} DISCRIM_UNION_PARAM_TYPE;
short UnionParamProc(
[in, switch_is(sUtype)] DISCRIM_UNION_PARAM_TYPE Union,
[in] short sUtype);
Az előző példában szereplő egyesítés egyetlen értéket tartalmazhat: rövid, lebegőpontos, vagy karaktert. Az egyesítés típusdefiníciója tartalmazza a MIDL switch_type attribútumot, amely meghatározza a megkülönböztető típusát. Itt a [switch_type(short)] azt határozza meg, hogy a diszkrimináns rövidtípusú. A kapcsolónak egész szám típusúnak kell lennie.
Ha az unió egy struktúra tagja, akkor a diszkriminánsnak ugyanannak a struktúrának a tagja kell lennie. Ha az egyesítő paraméter egy paraméter, akkor a megkülönböztetőnek egy másik paraméternek kell lennie. Az előző példában UnionParamProc függvény prototípusa a hívás utolsó paramétereként a megkülönböztetett sUtype mutatja. (A diszkrimináns a hívás bármely pozíciójában megjelenhet.) A ([switch_is] attribútumban megadott paraméter típusának meg kell egyeznie a [switch_type] attribútumban megadott típussal.
Az alábbi példa egy olyan struktúra használatát mutatja be, amely a diszkriminánst az unióhoz csomagolja:
typedef struct
{
short utype; /* discriminant can precede or follow union */
[switch_is(utype)] union
{
[case(0)] short sVal;
[case(1)] float fVal;
[case(2)] char chVal;
[default] ;
} u;
} DISCRIM_UNION_STRUCT_TYPE;
short UnionStructProc(
[in] DISCRIM_UNION_STRUCT_TYPE u1);
A Microsoft RPC MIDL fordító lehetővé teszi az egyesítő deklarációkat typedef szerkezeteken kívül. Ez a funkció a DCE IDL bővítménye. További információ: union.