atribut unik
Atribut [unik] menentukan pointer unik.
pointer_default(unique)
typedef [ unique [[ , type-attribute-list ]] ] type-specifier declarator-list;
typedef struct-or-union-declarator
{
[ unique [[ , field-attribute-list ]] ] type-specifier declarator-list;
...}
[ unique [[ , function-attribute-list ]] ] type-specifier ptr-decl function-name(
[[ [ parameter-attribute-list ] ]] type-specifier [[declarator]]
, ...);
[[ [ function-attribute-list ] ]] type-specifier [[ptr-decl]] function-name(
[ unique [[ , parameter-attribute-list ]] ] type-specifier [[declarator]]
, ...);
-
type-attribute-list
-
Menentukan satu atau beberapa atribut yang berlaku untuk jenis tersebut. Atribut jenis yang valid termasuk [handle], [switch_type], [transmit_as]; atribut pointer [ref], [unique], atau [ptr]; dan atribut penggunaan [context_handle], [string], dan [abaikan]. Pisahkan beberapa atribut dengan koma.
-
type-specifier
-
Menentukan jenis dasar, struct, union, enum type, atau type identifier. Spesifikasi penyimpanan opsional dapat mendahului penentu jenis.
-
deklarator dan daftar deklarator
-
Menentukan deklarator C standar, seperti pengidentifikasi, deklarator pointer, dan deklarator array. Untuk informasi selengkapnya, lihat Atribut Array dan Sized-Pointer, array., dan Array dan Pointer. Daftar deklarator terdiri dari satu atau beberapa deklarator yang dipisahkan oleh koma. Pengidentifikasi nama parameter dalam deklarator fungsi bersifat opsional.
-
struct-or-union-declarator
-
field-attribute-list
-
Menentukan atribut bidang nol atau lebih yang berlaku untuk anggota struktur, anggota serikat, atau parameter fungsi. Atribut bidang yang valid meliputi [first_is], [last_is], [length_is], [max_is], [size_is]; atribut penggunaan [string], [ignore], dan [context_handle]; atribut pointer [ref], [unique], atau [ptr]; dan atribut union [switch_type]. Pisahkan beberapa atribut bidang dengan koma.
-
function-attribute-list
-
Menentukan atribut nol atau lebih yang berlaku untuk fungsi. Atribut fungsi yang valid adalah [callback], [local]; atribut pointer [ref], [unique], atau [ptr]; dan atribut penggunaan [string], [abaikan], dan [context_handle].
-
ptr-decl
-
Menentukan setidaknya satu deklarator pointer tempat atribut [unik] berlaku. Deklarator pointer sama dengan deklarator penunjuk yang digunakan dalam C; ini dibangun dari penunjuk * , pengubah seperti jauh, dan konsekuensi kualifikasi.
-
nama fungsi
-
Menentukan nama prosedur jarak jauh.
-
parameter-attribute-list
-
Terdiri dari nol atau lebih atribut yang sesuai untuk jenis parameter yang ditentukan. Atribut parameter dapat mengambil atribut arah [in] dan [out]; atribut bidang [first_is], [last_is], [length_is], [max_is], [size_is], dan [switch_type]; atribut pointer [ref], unik, atau ptr; dan atribut penggunaan [context_handle] dan [string]. Atribut penggunaan [abaikan] tidak dapat digunakan sebagai atribut parameter. Pisahkan beberapa atribut dengan koma.
Atribut pointer dapat diterapkan sebagai atribut jenis; sebagai atribut bidang yang berlaku untuk anggota struktur, anggota serikat, atau parameter; atau sebagai atribut fungsi yang berlaku untuk jenis pengembalian fungsi. Atribut pointer juga dapat muncul dengan kata kunci [pointer_default] .
Pointer unik memiliki karakteristik berikut:
- Dapat memiliki nilai NULL.
- Dapat berubah selama panggilan dari NULL ke non-NULL, dari non-NULL ke NULL, atau dari satu nilai non-NULL ke nilai lainnya.
- Dapat mengalokasikan memori baru pada klien. Ketika pointer unik berubah dari NULL ke non-NULL, data yang dikembalikan dari server ditulis ke penyimpanan baru.
- Dapat menggunakan memori yang ada pada klien tanpa mengalokasikan memori baru. Saat penunjuk unik berubah selama panggilan dari satu nilai non-NULL ke nilai lainnya, penunjuk diasumsikan menunjuk ke objek data dengan jenis yang sama. Data yang dikembalikan dari server ditulis ke penyimpanan yang ada yang ditentukan oleh nilai pointer unik sebelum panggilan.
- Dapatkah memori yatim piatu pada klien. Memori yang direferensikan oleh penunjuk unik non-NULL mungkin tidak pernah dikosongkan jika penunjuk unik berubah menjadi NULL selama panggilan dan klien tidak memiliki cara lain untuk mendereferensikan penyimpanan.
- Tidak menyebabkan alias. Seperti penyimpanan yang diacu oleh penunjuk referensi, penyimpanan yang diacu oleh pointer unik tidak dapat dijangkau dari nama lain dalam fungsi.
Stub memanggil fungsi manajemen memori yang disediakan pengguna midl_user_allocate dan midl_user_free untuk mengalokasikan dan membatalkan alokasi memori yang diperlukan untuk pointer unik dan referensi mereka.
Pembatasan berikut berlaku untuk pointer unik:
- Atribut [unik] tidak dapat diterapkan ke parameter binding-handle ( handle_t) dan parameter handel konteks.
- Atribut [unik] tidak dapat diterapkan ke parameter penunjuk tingkat atas [out]-only (parameter yang hanya memiliki atribut arah [out ]).
- Secara default, penunjuk tingkat atas dalam daftar parameter adalah penunjuk [ref]. Ini benar meskipun antarmuka menentukan pointer_default(unik). Parameter tingkat atas dalam daftar parameter harus ditentukan dengan atribut [unik] untuk menjadi penunjuk unik.
- Pointer unik tidak dapat digunakan untuk menggambarkan ukuran array atau lengan union karena pointer unik dapat memiliki nilai NULL. Pembatasan ini mencegah kesalahan yang menghasilkan jika nilai NULL digunakan sebagai ukuran array atau ukuran union-arm.
pointer_default(unique)
typedef [unique, string] unsigned char * MY_STRING_TYPE;
[unique] char * MyFunction([in, out, unique] long * plNumber);