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], [문자열], [무시]. 여러 특성을 쉼표로 구분합니다.
-
type-specifier
-
기본 형식, 구조체, 공용 구조체 또는 열거형 형식 또는 형식 식별자를 지정합니다. 선택적 스토리지 사양은 형식 지정자 앞에 설 수 있습니다.
-
표준 선언자
-
식별자, 포인터 선언자 또는 배열 선언자와 같은 표준 C 선언자를 지정합니다. 자세한 내용은 배열 및 Sized-Pointer 특성, 배열 및 배열 및 포인터를 참조하세요.
-
declarator-list
-
식별자, 포인터 선언자 및 배열 선언자와 같은 표준 C 선언자를 지정합니다. 자세한 내용은 배열 및 Sized-Pointer 특성, 배열 및 배열 및 포인터를 참조하세요. declarator-list는 쉼표로 구분된 하나 이상의 선언자로 구성됩니다. 함수 선언자의 매개 변수 이름 식별자는 선택 사항입니다.
-
field-attribute-list
-
구조체 또는 공용 구조체 멤버 또는 함수 매개 변수에 적용되는 0개 이상의 필드 특성을 지정합니다. 유효한 필드 특성에는 [first_is], [last_is], [length_is], [max_is], [size_is]이 포함됩니다. 사용 특성 [문자열], [무시] 및 [context_handle]; 포인터 특성 [ref], [unique] 또는 [ptr]; 및 union 특성 [switch_type]. 여러 필드 특성을 쉼표로 구분합니다.
-
function-attribute-list
-
함수에 적용되는 0개 이상의 특성을 지정합니다. 유효한 함수 특성은 [콜백], [로컬]입니다. 포인터 특성 [ref], [unique] 또는 [ptr]; 및 사용 특성 [문자열], [무시] 및 [context_handle].
-
ptr-decl
-
[ptr] 특성이 적용되는 포인터 선언자를 하나 이상 지정합니다. 포인터 선언자는 C에서 사용되는 포인터 선언자와 동일합니다. * 지정자, 한정자(예: far) 및 한정자 const에서 생성됩니다.
-
function-name
-
원격 프로시저의 이름을 지정합니다.
-
parameter-attribute-list
-
지정된 매개 변수 형식에 적합한 0개 이상의 특성으로 구성됩니다. 매개 변수 특성은 방향 특성을 내/외부로 가져올 수 있습니다. 필드 특성 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);