union 屬性
union關鍵字會出現在與區分等位相關的函式中。
/* Encapsulated union*/
typedef [[ [type-attribute-list] ]] union [[ struct-name ]] switch (switch-type switch-name) [[ union-name ]]
{
C-style-case-list
[[ [ field-attribute-list <> ] ]] type-specifier <> declarator-list <>;
...
}
/* Non-encapsulated union*/
typedef [switch_type(switch-type) [[ , type-attr-list ]] ] union [[ tag ]]
{
[ case ( limited-expr-list) ]
[[ [ field-attribute-list ] ]] type-specifier declarator-list;
[[ [ default ]
[[ [ field-attribute-list ] ]] type-specifier declarator-list;
]]
}
-
type-attribute-list
-
指定套用至等位類型的零個或多個屬性。 有效的類型屬性包括 [handle]、 [transmit_as];指標屬性 [unique], 或 [ptr];和使用量屬性 [coNtext_handle] 和 [ignore] 。 封裝的等位也可以有 [ref] 指標類型屬性。 以逗號分隔多個屬性。
-
struct-name
-
指定選擇性標記,以命名 MIDL 編譯器所產生的結構。
-
switch-type
-
switch-name
-
指定類型 switch-type 變數的名稱,做為等位辨別。
-
union-name
-
指定選擇性識別碼,這個識別碼會命名 MIDL 編譯器所產生的結構中聯集,其中包含等位和辨別。
-
C-style-case-list
-
「caseconst-expr :」 的清單
-
limited-expression-list
-
指定一或多個 C 語言運算式。 MIDL 編譯器支援條件運算式、邏輯運算式、關聯運算式和算術運算式。 MIDL 不允許運算式中的函式呼叫,而且不允許遞增和遞減運算子。 清單中的個別運算式應該以逗號分隔。
-
field-attribute-list
-
指定套用至等位成員的零個或多個欄位屬性。 有效的欄位屬性包括[first_is]、[last_is]、[length_is]、[max_is]、[size_is];使用屬性[string]、 [ignore], 和[coNtext_handle];指標屬性[unique]或[ptr];和,針對非capsulated 等位的成員,聯集屬性[switch_type]。 非capsulated 等位也可以使用 [ref] 指標欄位屬性。 以逗號分隔多個欄位屬性。
-
type-specifier
-
declarator-list
-
一或多個標準 C 宣告子,例如識別碼、指標宣告子和陣列宣告子。 (函式宣告子和位欄位宣告不允許在遠端程序呼叫中傳輸的等位。除了當您使用 MIDL 編譯器參數 /osf時,這些宣告子都允許在未傳輸的等位中。) 以逗號分隔多個宣告子。
-
標記
-
指定選擇性標記。
MIDL 支援兩種類型的區分等位:封裝的 等 位和 非覆寫的等位。 封裝的等位與先前的 RPC (NCA 第 1 版實作相容) 。 非擷取聯集會消除封裝聯集的一些限制,並提供比封裝聯集更可見的辨別。
封裝的等位是由 switch 關鍵字所識別,而且沒有其他等位相關關鍵字。
非擷取的等位也稱為等位,是由 [switch_is] 和 [switch_type] 關鍵字識別,可識別辨識其類型。
當您使用 [in, out] 等位時,請注意,在呼叫期間變更等位參數的值可能會讓遠端呼叫的行為與本機呼叫不同。 傳回時,存根會將 [in, out] 參數複製到用戶端上已經存在的記憶體中。 當遠端程式修改聯集參數的值,因而變更資料物件的大小時,存根可以使用 [out] 值覆寫有效的記憶體。 當等位參數將資料物件從基底類型變更為指標類型時,當存根將指標參照複製到基底類型的 [in] 值所指示的記憶體位置時,存根可以覆寫有效的記憶體。
等位的形狀必須跨平臺相同,以確保互連性。