union 属性
共用体キーワード (keyword)は、判別共用体に関連する関数に表示されます。
/* 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
-
共用体の型に適用される 0 個以上の属性を指定します。 有効な型属性には 、[handle]、 [transmit_as]が含まれます。ポインター属性 [unique]、 [ptr];と usage 属性 [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
-
1 つ以上の C 言語式を指定します。 MIDL コンパイラでは、条件付き式、論理式、リレーショナル式、および算術式がサポートされています。 MIDL では、式での関数呼び出しは許可されず、インクリメント演算子とデクリメント演算子は使用できません。 リスト内の個々の式はコンマで区切る必要があります。
-
field-attribute-list
-
共用体メンバーに適用される 0 個以上のフィールド属性を指定します。 有効なフィールド属性には、[first_is]、[last_is]、[length_is]、[max_is]、[size_is];使用法属性 [string], [ignore], [context_handle];ポインター属性 [unique] または [ptr];また、カプセル化されていない共用体であるメンバーの場合は、共用体属性 [switch_type]。 カプセル化されていない共用体では 、[ref] ポインター フィールド属性を使用することもできます。 複数のフィールド属性をコンマで区切ります。
-
type-specifier
-
基本型、構造体、共用体、列挙型、または型識別子を指定します。 省略可能なストレージ仕様は 、型指定子の前に置くことができます。
-
declarator-list
-
識別子、ポインター宣言子、配列宣言子など、1 つ以上の標準 C 宣言子。 (関数宣言子とビット フィールド宣言は、リモート プロシージャ 呼び出しで送信される共用体では使用できません。MIDL コンパイラ スイッチ /osf を使用する場合を除き、これらの宣言子は、送信されない共用体で許可されます)。複数の宣言子をコンマで区切ります。
-
tag
-
省略可能なタグを指定します。
MIDL では、 カプセル化共用 体と非カプセル化共用体の 2 種類 の判別共用体がサポートされています。 カプセル化された共用体は、RPC (NCA バージョン 1) の以前の実装と互換性があります。 カプセル化されていない共用体は、カプセル化された共用体の制限の一部を排除し、カプセル化された共用体よりも目に見える判別を提供します。
カプセル化された共用体は、スイッチ キーワード (keyword)によって識別され、他の共用体関連キーワードが存在しない場合です。
非カプセル化共用体 (共用体とも呼ばれます) は、[switch_is] キーワードと [switch_type] キーワードの存在によって識別されます。これは判別式とその型を識別します。
[in, out] 共用体を使用する場合は、呼び出し中に共用体スイッチの値を変更すると、リモート呼び出しの動作がローカル呼び出しとは異なる場合があることに注意してください。 返されると、スタブは [in, out] パラメーターを、クライアントに既に存在するメモリにコピーします。 リモート プロシージャが共用体スイッチの値を変更し、結果としてデータ オブジェクトのサイズを変更すると、スタブは有効なメモリを [out] 値で上書きできます。 共用体スイッチがデータ オブジェクトを基本型からポインター型に変更すると、ベース型の [in] 値によって示されるメモリ位置にポインター参照先をコピーすると、スタブによって有効なメモリが上書きされる可能性があります。
相互接続性を確保するには、プラットフォーム間で共用体の形状が同一である必要があります。