unique 屬性
[unique]屬性會指定唯一的指標。
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
-
指定套用至類型的一或多個屬性。 有效的類型屬性包括 [handle]、 [switch_type]、 [transmit_as];指標屬性 [ref]、 [unique]或 [ptr];和使用方式屬性 [coNtext_handle]、 [string]和 [ignore]。 以逗號分隔多個屬性。
-
type-specifier
-
指定 基底類型、 結構、 等位、 列舉 類型或類型識別碼。 選擇性的儲存體規格可以在 type-specifier之前。
-
declarator 和 declarator-list
-
指定標準 C 宣告子,例如識別碼、指標宣告子和陣列宣告子。 如需詳細資訊,請參閱 Array 和 Sized-Pointer Attributes、 arrays.和 Arrays 和 Pointers。 declarator-list是由一或多個宣告子所組成,並以逗號分隔。 函式宣告子中的參數名稱識別碼是選擇性的。
-
struct-or-union-declarator
-
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
-
指定至少一個套用 [unique] 屬性的指標宣告子。 指標宣告子與 C 中使用的指標宣告子相同;它是從 * 指示項、 遠方修飾詞和限定詞 const所建構。
-
function-name
-
指定遠端程式的名稱。
-
parameter-attribute-list
-
由零個或多個適用于指定參數類型的屬性所組成。 參數屬性可以採用方向屬性[in]和[out];欄位屬性[first_is]、[last_is]、[length_is]、[max_is]、[size_is]和[switch_type];指標屬性[ref]、unique或ptr;和使用方式屬性[coNtext_handle]和[string]。 使用方式屬性 [ignore] 無法當做參數屬性使用。 以逗號分隔多個屬性。
指標屬性可以套用為類型屬性;當做套用至結構成員、聯集成員或參數的欄位屬性;或 作為套用至函式傳回型別的函式屬性。 指標屬性也可以與 [pointer_default] 關鍵字一起出現。
唯一指標具有下列特性:
- 可以有 Null值。
- 在從 Null 呼叫期間變更為非 Null、從非Null變更為Null,或從一個非Null 值變更為另一個。
- 可以在用戶端上配置新的記憶體。 當唯一指標從 Null 變更為非Null時,從伺服器傳回的資料會寫入新的儲存體。
- 可以在用戶端上使用現有的記憶體,而不需配置新的記憶體。 當從一個非 Null 值呼叫期間的唯一指標變更為另一個值 時,會假設指標指向相同類型的資料物件。 從伺服器傳回的資料會寫入呼叫之前唯一指標的值所指定的現有儲存體。
- 用戶端上的孤立記憶體。 如果唯一指標在呼叫期間變更為 Null,而且用戶端沒有另一種方法來取值儲存體,則不可釋放非Null唯一指標所參考的記憶體。
- 不會導致別名。 如同參考指標所指向的儲存體,無法從函式中的任何其他名稱觸達唯一指標所指向的儲存體。
存根會呼叫使用者提供的記憶體管理功能 ,midl_user_allocate 和 midl_user_free 來配置和解除配置唯一指標及其引用所需的記憶體。
下列限制適用于唯一指標:
- [unique]屬性無法套用至系結控制碼參數, ( handle_t) 和內容控制碼參數。
- [unique]屬性無法套用至[out]-only 最上層指標參數, (只有[out]方向屬性的參數) 。
- 根據預設,參數清單中的最上層指標是 [ref] 指標。 即使介面指定 pointer_default (唯一) 也是如此。 參數清單中的最上層參數必須使用 [unique] 屬性來指定,才能成為唯一指標。
- 唯一指標無法用來描述陣列或等位 Arm 的大小,因為唯一指標可以有 Null值。 這項限制可防止當做陣列大小或等位 ARM 大小使用 Null 值時所產生的錯誤。
pointer_default(unique)
typedef [unique, string] unsigned char * MY_STRING_TYPE;
[unique] char * MyFunction([in, out, unique] long * plNumber);