C 語言的某些功能,例如等位,需要特殊的 MIDL 關鍵詞,以支援其在遠端過程調用中的使用。 C 語言中的等位是保存不同類型和大小的物件的變數。 開發人員通常會建立變數,以追蹤儲存在等位中的類型。 若要在分散式環境中正確運作,表示聯集類型的變數,或 辨別,也必須可供遠端計算機使用。 MIDL 提供 [switch_type] 和 [switch_is] 關鍵詞,以識別辨識辨識類型和名稱。
MIDL 要求以下列兩種方式之一與聯集一起傳輸歧視:
- 聯集和辨別必須以參數的形式提供。
- 聯集和辨別項必須封裝在 結構中。
MIDL 提供兩種基本型別的差別聯集:nonencapsulated_union 和 encapsulated_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);
這個範例中的等位可以包含單一值:短、float或 char。 等位的型別定義包含 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 的延伸模組。 如需詳細資訊,請參閱 等位。