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


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.