atribut union
Kata kunci gabungan muncul dalam fungsi yang terkait dengan serikat yang diskriminasi.
/* 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;
]]
}
Parameter
-
type-attribute-list
-
Menentukan nol atau lebih atribut yang berlaku untuk jenis union. Atribut jenis yang valid termasuk [handle], [transmit_as]; atribut pointer [unik], atau [ptr]; dan atribut penggunaan [context_handle] dan [abaikan]. Serikat enkapsulasi juga dapat memiliki atribut jenis penunjuk [ref]. Pisahkan beberapa atribut dengan koma.
-
struct-name
-
Menentukan tag opsional yang menamai struktur yang dihasilkan oleh pengkompilasi MIDL.
-
switch-type
-
Menentukan int, char, enum type, atau pengidentifikasi yang diselesaikan ke salah satu jenis ini.
-
switch-name
-
Menentukan nama variabel jenis switch-type yang bertindak sebagai diskriminan serikat.
-
union-name
-
Menentukan pengidentifikasi opsional yang menamai penyatuan dalam struktur, yang dihasilkan oleh pengkompilasi MIDL, yang berisi serikat pekerja dan diskriminan.
-
C-style-case-list
-
Daftar "caseconst-expr :"
-
daftar ekspresi terbatas
-
Menentukan satu atau beberapa ekspresi bahasa C. Pengkompilasi MIDL mendukung ekspresi kondisional, ekspresi logis, ekspresi relasional, dan ekspresi aritmatika. MIDL tidak mengizinkan pemanggilan fungsi dalam ekspresi dan tidak memungkinkan operator kenaikan dan penurunan. Ekspresi individual dalam daftar harus dipisahkan oleh koma.
-
field-attribute-list
-
Menentukan nol atau beberapa atribut bidang yang berlaku untuk anggota serikat. Atribut bidang yang valid termasuk [first_is], [last_is], [length_is], [max_is], [size_is]; atribut penggunaan [string], [ignore], dan [context_handle]; atribut pointer [unik] atau [ptr]; dan, untuk anggota yang merupakan gabungan yang tidak dienkapsulasi, atribut union [switch_type]. Serikat yang tidak dienkapsulasi juga dapat menggunakan atribut bidang penunjuk [ref]. Pisahkan beberapa atribut bidang dengan koma.
-
type-specifier
-
Menentukan jenis dasar, struktur, penyatuan, jenis enum , atau pengidentifikasi jenis. Spesifikasi penyimpanan opsional dapat mendahului type-specifier.
-
daftar deklarator
-
Satu atau beberapa deklarator C standar, seperti pengidentifikasi, deklarator pointer, dan deklarator array. (Deklarasi fungsi dan deklarasi bit-field tidak diizinkan dalam serikat yang ditransmisikan dalam panggilan prosedur jarak jauh. Kecuali ketika Anda menggunakan sakelar pengkompilasi MIDL /osf, deklarator ini diizinkan dalam serikat yang tidak ditransmisikan.) Pisahkan beberapa deklarator dengan koma.
-
tag
-
Menentukan tag opsional.
Keterangan
MIDL mendukung dua jenis serikat yang diskriminasi: serikat terenkapsulasi dan serikat nonenkapsulasi. Penyatuan yang dienkapsulasi kompatibel dengan implementasi RPC sebelumnya (NCA versi 1). Serikat yang tidak dienkapsulasi menghilangkan beberapa pembatasan serikat yang dienkapsulasi dan memberikan diskriminan yang lebih terlihat daripada serikat yang dienkapsulasi.
Penyatuan yang dienkapsulasi diidentifikasi oleh kata kunci switch dan tidak adanya kata kunci terkait serikat lainnya.
Serikat yang tidak dienkapsulasi, juga dikenal sebagai serikat, diidentifikasi dengan adanya kata kunci [switch_is] dan [switch_type] , yang mengidentifikasi diskriminan dan jenisnya.
Saat Anda menggunakan serikat[in, out], ketahuilah bahwa mengubah nilai sakelar serikat selama panggilan dapat membuat panggilan jarak jauh berkinerja berbeda dari panggilan lokal. Saat dikembalikan, stub menyalin parameter [in, out] ke dalam memori yang sudah ada pada klien. Ketika prosedur jarak jauh memodifikasi nilai sakelar union dan akibatnya mengubah ukuran objek data, stub dapat menimpa memori yang valid dengan nilai [out ]. Ketika sakelar gabungan mengubah objek data dari jenis dasar ke jenis penunjuk, stub dapat menimpa memori yang valid saat mereka menyalin pointer yang dirujuk ke lokasi memori yang ditunjukkan oleh nilai [in] dari jenis dasar.
Bentuk serikat harus identik di seluruh platform untuk memastikan interkonektivitas.
Lihat juga