共用方式為


union 關鍵詞 (RPC)

C 語言的某些功能,例如等位,需要特殊的 MIDL 關鍵詞,以支援其在遠端過程調用中的使用。 C 語言中的等位是保存不同類型和大小的物件的變數。 開發人員通常會建立變數,以追蹤儲存在等位中的類型。 若要在分散式環境中正確運作,表示聯集類型的變數,或 辨別,也必須可供遠端計算機使用。 MIDL 提供 [switch_type] 和 [switch_is] 關鍵詞,以識別辨識辨識類型和名稱。

MIDL 要求以下列兩種方式之一與聯集一起傳輸歧視:

  • 聯集和辨別必須以參數的形式提供。
  • 聯集和辨別項必須封裝在 結構中。

MIDL 提供兩種基本型別的差別聯集:nonencapsulated_unionencapsulated_union。 如果聯集是參數,則非capsulated 等位的辨別是另一個參數。 如果聯集是結構的欄位,則為另一個字段。 封裝聯集的定義會變成結構定義,其第一個字段是辨別項,而其第二個和最後一個字段是等位。 下列範例示範如何提供等位和辨別參數:

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

這個範例中的等位可以包含單一值:floatchar。 等位的型別定義包含 MIDL switch_type 屬性,指定辨別項的類型。 在這裡,[switch_type(short)] 會指定辨別項的類型為 short。 參數必須是整數類型。

如果等位是結構的成員,則辨別項必須是相同結構的成員。 如果等位是參數,則辨別項必須是另一個參數。 上述範例中函式的原型 UnionParamProc 會顯示辨別 sUtype 為呼叫的最後一個參數。 (歧視者可以在通話中的任何位置出現。[switch_is] 屬性中指定的參數類型必須符合 [switch_type] 屬性中指定的類型。

下列範例示範使用單一結構,將辨別與等位封裝在一起:

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 編譯程式允許 typedef 建構以外的等位宣告。 這項功能是 DCE IDL 的延伸模組。 如需詳細資訊,請參閱 等位