Dela via


union keyword (RPC)

Vissa funktioner i C-språket, till exempel fackföreningar, kräver särskilda MIDL-nyckelord för att stödja deras användning i fjärrproceduranrop. En union i C-språket är en variabel som innehåller objekt av olika typer och storlekar. Utvecklaren skapar vanligtvis en variabel för att hålla reda på de typer som lagras i unionen. För att fungera korrekt i en distribuerad miljö måste variabeln som anger typen av union, eller diskriminerande, också vara tillgänglig för fjärrdatorn. MIDL innehåller nyckelorden [switch_type] och [switch_is] för att identifiera den diskriminerande typen och namnet.

MIDL kräver att diskriminanten överförs med facket på ett av två sätt:

  • Facket och den diskriminerande måste anges som parametrar.
  • Facket och den diskriminerande måste paketeras i en struktur.

Två grundläggande typer av diskriminerade fackföreningar tillhandahålls av MIDL: nonencapsulated_union och encapsulated_union. Discriminant för en icke-kapslad union är en annan parameter om unionen är en parameter. Det är ett annat fält om unionen är ett fält i en struktur. Definitionen av en inkapslad union omvandlas till en strukturdefinition vars första fält är discriminant och vars andra och sista fält är unionen. I följande exempel visas hur du tillhandahåller unionen och discriminant som parametrar:

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

Unionen i föregående exempel kan innehålla ett enda värde: antingen kort, flyttaleller tecken. Typdefinitionen för unionen innehåller attributet MIDL switch_type som anger typen av discriminant. Här anger [switch_type(short)] att den diskriminerande typen är av typen kort. Växeln måste vara en heltalstyp.

Om facket är medlem i en struktur måste den diskriminerande vara medlem i samma struktur. Om unionen är en parameter måste diskriminanten vara en annan parameter. Prototypen för funktionen UnionParamProc i föregående exempel visar den discriminanta sUtype som den sista parametern för anropet. (Den diskriminerande kan visas i vilken position som helst i samtalet.) Typen av parameter som anges i attributet [switch_is] måste matcha den typ som anges i attributet [switch_type].

I följande exempel visas användningen av en enda struktur som paketar den diskriminerande med unionen:

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

Microsoft RPC MIDL-kompilatorn tillåter unionsdeklarationer utanför typedef- konstruktioner. Den här funktionen är ett tillägg till DCE IDL. Mer information finns i union.