atribut ptr
Atribut [ptr] menunjuk pointer sebagai penunjuk penuh.
pointer_default(ptr)
typedef [ ptr [ , type-attribute-list ] ] type-specifier declarator-list;
typedef [ struct | union ]
{
[ ptr [ , field-attribute-list ] ] type-specifier declarator-list;
...
}
[ ptr [ , function-attribute-list ] ] type-specifier ptr-decl function-name(
[ [ parameter-attribute-list ] ] type-specifier [standard-declarator]
, ...);
[[ [ function-attribute-list ] ]] type-specifier [[ptr-decl]] function-name(
[ ptr [[ , parameter-attribute-list ]] ] type-specifier [[standard-declarator]]
, ...);
Parameter
-
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 [ignore]. Pisahkan beberapa atribut dengan koma.
-
type-specifier
-
Menentukan jenis dasar, struct, union, atau pengidentifikasi jenis atau jenis enum . Spesifikasi penyimpanan opsional dapat mendahului type-specifier.
-
deklarator standar
-
Menentukan deklarator C standar, seperti pengidentifikasi, deklarator penunjuk, atau deklarator array. Untuk informasi selengkapnya, lihat Array dan Sized-Pointer Atribut, array, dan Array dan Pointer.
-
daftar deklarator
-
Menentukan deklarator C standar, seperti pengidentifikasi, deklarator pointer, dan deklarator array. Untuk informasi selengkapnya, lihat Array dan Sized-Pointer Atribut, 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.
-
field-attribute-list
-
Menentukan atribut bidang nol atau lebih yang berlaku untuk struktur atau anggota union atau parameter fungsi. Atribut bidang yang valid termasuk [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 nol atau lebih atribut 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 [ptr] diterapkan. Deklarator penunjuk sama dengan deklarator penunjuk yang digunakan dalam C; ini dibangun dari * penunjuk, pengubah seperti jauh, dan konstan 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 masuk dan keluar; 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 tidak dapat digunakan sebagai atribut parameter. Pisahkan beberapa atribut dengan koma.
Keterangan
Penunjuk lengkap yang ditunjuk oleh atribut [ptr] mendekati fungsionalitas penuh dari penunjuk bahasa C. Penunjuk penuh dapat memiliki nilai NULL dan dapat berubah selama panggilan dari NULL ke non-NULL. Penyimpanan yang ditunjukkan oleh penunjuk penuh dapat dicapai dengan nama lain dalam aplikasi yang mendukung alias dan siklus. Fungsionalitas ini memerlukan lebih banyak overhead selama panggilan prosedur jarak jauh untuk mengidentifikasi data yang dirujuk oleh penunjuk, menentukan apakah nilainya NULL, dan untuk menemukan apakah dua pointer menunjuk ke data yang sama.
Gunakan pointer penuh untuk:
- Nilai pengembalian jarak jauh.
- Penunjuk ganda, ketika ukuran parameter output tidak diketahui.
- Penunjuk NULL .
Penunjuk penuh (dan unik) tidak dapat digunakan untuk menjelaskan ukuran array atau union karena pointer ini dapat memiliki nilai NULL. Pembatasan oleh MIDL ini mencegah kesalahan yang dapat mengakibatkan ketika nilai NULL digunakan sebagai ukuran.
Referensi dan pointer unik diasumsikan tidak menyebabkan alias data. Grafik terarah yang diperoleh dengan memulai dari pointer unik atau referensi dan hanya mengikuti pointer unik atau referensi tidak berisi konvergensi ulang atau siklus.
Untuk menghindari alias, semua nilai pointer harus diperoleh dari pointer input dari kelas pointer yang sama. Jika lebih dari satu pointer menunjuk ke lokasi memori yang sama, semua pointer tersebut harus berupa pointer penuh.
Dalam beberapa kasus, pointer penuh dan unik dapat dicampur. Penunjuk lengkap dapat diberi nilai penunjuk unik, selama penugasan tidak melanggar batasan untuk mengubah nilai pointer unik. Namun, saat Anda menetapkan pointer unik, nilai penunjuk penuh, Anda dapat menyebabkan alias.
Mencampur pointer penuh dan unik dapat menyebabkan alias, seperti yang ditunjukkan dalam contoh berikut:
typedef struct
{
[ptr] short * pdata; // full pointer
} GRAPH_NODE_TYPE;
typedef struct
{
[unique] graph_node * left; // unique pointer
[unique] graph_node * right; // unique pointer
} TREE_NODE_TYPE;
// application code:
short a = 5;
TREE_NODE_TYPE * t;
GRAPH_NODE_TYPE g, h;
g.pdata = h.pdata = &a;
t->left = &g;
t->right = &h;
// t->left->pdata == t->right->pdata == &a
Meskipun "t-left>" dan "t-right>" menunjuk ke lokasi memori yang unik, "t-left-pdata>>" dan "t-right-pdata>>" diberi alias. Untuk alasan ini, algoritma dukungan alias harus mengikuti semua pointer (termasuk pointer unik dan referensi) yang akhirnya dapat mencapai pointer penuh.
Contoh
pointer_default(ptr)
typedef [ptr, string] unsigned char * MY_STRING_TYPE;
[ptr] char * MyFunction([in, out, unique] long * plNumber);
Lihat juga