ptr 屬性
[ptr]屬性會將指標指定為完整指標。
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]]
, ...);
-
type-attribute-list
-
指定套用至類型的一或多個屬性。 有效的類型屬性包括 [handle]、 [switch_type]、 [transmit_as];指標屬性 [ref]、 [unique或 [ptr];以及使用屬性 [coNtext_handle]、 [string]和 [ignore]。 以逗號分隔多個屬性。
-
type-specifier
-
指定 基底類型、 結構、 等位或 列舉 類型或類型識別碼。 選擇性的儲存體規格可以在 type-specifier之前。
-
standard-declarator
-
指定標準 C 宣告子,例如識別碼、指標宣告子或陣列宣告子。 如需詳細資訊,請參閱 陣列和Sized-Pointer屬性、 陣列和 陣列和指標。
-
declarator-list
-
指定標準 C 宣告子,例如識別碼、指標宣告子和陣列宣告子。 如需詳細資訊,請參閱 陣列和Sized-Pointer屬性、 陣列和 陣列和指標。 declarator-list是由一或多個宣告子所組成,並以逗號分隔。 函式宣告子中的參數名稱識別碼是選擇性的。
-
field-attribute-list
-
指定套用至結構或等位成員或函式參數的零個或多個欄位屬性。 有效的欄位屬性包括[first_is]、[last_is]、[length_is]、[max_is]、[size_is];使用方式屬性[string]、[ignore]和[coNtext_handle];指標屬性[ref]、[unique]或[ptr];和等位屬性[switch_type]。 以逗號分隔多個欄位屬性。
-
function-attribute-list
-
指定套用至函式的零個或多個屬性。 有效的函式屬性為[callback], [local];指標屬性[ref]、[unique]或[ptr];和使用方式屬性[string]、[ignore]和[coNtext_handle]。
-
ptr-decl
-
指定至少一個套用 [ptr] 屬性的指標宣告子。 指標宣告子與 C 中使用的指標宣告子相同;它是從 * 指示項、 遠方修飾詞和限定詞 const所建構。
-
function-name
-
指定遠端程式的名稱。
-
parameter-attribute-list
-
由零個或多個適用于指定參數類型的屬性所組成。 參數屬性可以傳入和取出方向屬性;欄位屬性first_is、last_is、length_is、max_is、size_is和switch_type; 指標屬性ref、unique或[ptr];和 使用方式屬性coNtext_handle和字串。 使用方式屬性 忽略 不能當做參數屬性使用。 以逗號分隔多個屬性。
[ptr]屬性所指定的完整指標會接近 C 語言指標的完整功能。 完整指標可以有 Null 值,而且可以在呼叫期間從 Null 變更為非Null。 支援別名和迴圈之應用程式中的其他名稱可以觸達完整指標所指向的儲存體。 這項功能在遠端程序呼叫期間需要更多額外負荷,以識別指標所參考的資料、判斷值是否為 Null,以及探索兩個指標是否指向相同的資料。
針對下列專案使用完整指標:
- 遠端傳回值。
- 當輸出參數的大小未知時,雙指標。
- Null 指標。
完整的 (和唯一) 指標無法用來描述陣列或等位的大小,因為這些指標可以有 Null值。 MIDL 的限制可防止當 Null 值做為大小時所產生的錯誤。
假設參考和唯一指標不會造成資料別名。 從唯一指標或參考指標開始取得的導向圖表,且只遵循唯一或參考指標不包含對帳或迴圈。
為了避免別名,所有指標值都應該從相同指標類別的輸入指標取得。 如果多個指標指向相同的記憶體位置,則所有這類指標都必須是完整指標。
在某些情況下,可以混合完整和唯一的指標。 只要指派不違反變更唯一指標值的限制,就可以指派完整指標的值。 不過,當您指派唯一指標時,可能會造成別名。
混合完整和唯一指標可能會導致別名,如下列範例所示:
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
雖然 「t-left」 和 「t-right >> 」 指向唯一的記憶體位置,但 「t-left-pdata > 」 和 「t-right-pdata >>> 」 是別名。 基於這個理由,別名支援演算法必須遵循所有指標, (包括最終可能到達完整指標的唯一和參考指標) 。
pointer_default(ptr)
typedef [ptr, string] unsigned char * MY_STRING_TYPE;
[ptr] char * MyFunction([in, out, unique] long * plNumber);