kata kunci union (RPC)

Beberapa fitur bahasa C, seperti serikat, memerlukan kata kunci MIDL khusus untuk mendukung penggunaannya dalam panggilan prosedur jarak jauh. Serikat dalam bahasa C adalah variabel yang menyimpan objek dari berbagai jenis dan ukuran. Pengembang biasanya membuat variabel untuk melacak jenis yang disimpan dalam gabungan. Untuk beroperasi dengan benar di lingkungan terdistribusi, variabel yang menunjukkan jenis serikat, atau diskriminan, juga harus tersedia untuk komputer jarak jauh. MIDL menyediakan kata kunci [switch_type] dan [switch_is] untuk mengidentifikasi jenis dan nama diskriminan.

MIDL mengharuskan diskriminan ditransmisikan dengan serikat dengan salah satu dari dua cara:

  • Serikat dan diskriminan harus disediakan sebagai parameter.
  • Serikat dan diskriminan harus dimas dalam struktur.

Dua jenis mendasar dari serikat yang didiskriminasi disediakan oleh MIDL: nonencapsulated_union dan encapsulated_union. Diskriminan dari union yang tidak dienkapsulasi adalah parameter lain jika union adalah parameter. Ini adalah bidang lain jika serikat adalah bidang struktur. Definisi serikat yang dienkapsulasi diubah menjadi definisi struktur yang bidang pertamanya adalah diskriminan dan bidang kedua dan terakhirnya adalah serikat. Contoh berikut menunjukkan cara memberikan penyatuan dan diskriminan sebagai parameter:

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

Penyatuan dalam contoh sebelumnya dapat berisi satu nilai: baik pendek, float, atau karakter. Definisi jenis untuk union mencakup atribut MIDL switch_type yang menentukan jenis diskriminan. Di sini, [switch_type(pendek)] menentukan bahwa diskriminan berjenis pendek. Sakelar harus berupa tipe bilangan bulat.

Jika serikat adalah anggota struktur, maka diskriminan harus menjadi anggota struktur yang sama. Jika penyatuan adalah parameter, maka diskriminan harus menjadi parameter lain. Prototipe untuk fungsi UnionParamProc dalam contoh sebelumnya menunjukkan sUtype diskriminan sebagai parameter terakhir panggilan. (Diskriminan dapat muncul di posisi mana pun dalam panggilan.) Jenis parameter yang ditentukan dalam atribut [switch_is] harus cocok dengan jenis yang ditentukan dalam atribut [switch_type ].

Contoh berikut menunjukkan penggunaan struktur tunggal yang mengemas diskriminan dengan serikat:

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

Pengkompilasi MICROSOFT RPC MIDL memungkinkan deklarasi gabungan di luar konstruksi typedef . Fitur ini adalah ekstensi untuk DCE IDL. Untuk informasi selengkapnya, lihat union.