閱讀英文

共用方式為


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

上述範例中的等位可以包含單一值: shortfloatchar。 等位的類型定義包含 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 的延伸模組。 如需詳細資訊,請參閱 等位