union 關鍵字 (RPC)
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);
上述範例中的等位可以包含單一值: short、 float或 char。 等位的類型定義包含 MIDL switch_type 屬性,指定辨別的類型。 在這裡,[switch_type (short) ] 指定辨別為 short類型。 參數必須是整數類型。
如果等位是結構的成員,則辨別項必須是相同結構的成員。 如果聯集是參數,則辨別項必須是另一個參數。 上述範例中 UnionParamProc 函式的原型會將辨別 sUtype 顯示為呼叫的最後一個參數。 (辨別可以出現在 call.) [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 的延伸模組。 如需詳細資訊,請參閱 等位。