atributo partial_ignore

O atributo ACF [partial_ignore] define uma versão especializada de ponteiros [exclusivos] que fornece semântica opcional.

[ [function-attribute-list <>] ] type-specifier <> [pointer- <>declarator <>] function-name <>( [ partial_ignore [ , parameter-attribute-list <> ] ] type-specifier <> [declarator <>] , ...);

Comentários

Ao criar uma função, é comum permitir que os usuários especifiquem um ponteiro não NULL para dados de retorno opcionais, geralmente chamados de ponteiro opcional. A memória apontada pelo usuário normalmente não é necessária para ser inicializada. Essa técnica representa um problema quando a função é usada por RPC.

Se o ponteiro opcional for válido, mas apontar para dados não inicializados, o RPC tentará realizar marshaling dos dados e enviá-los para o servidor, o que pode fazer com que o marshaling falhe e anule a chamada. Mesmo que o marshaling seja bem-sucedido, uma quantidade potencialmente grande de dados inúteis é enviada ao servidor.

Esses problemas são resolvidos marcando o ponteiro como [in, out, unique, partial_ignore]. Todos os quatro atributos devem estar presentes. Quando um ponteiro [partial_ignore] é empacotado no lado do cliente, os únicos dados enviados para o servidor são um indicador que mostra se o ponteiro é NULL. Se o ponteiro não for NULL, a rotina do lado do servidor receberá um ponteiro válido para um bloco de memória que foi inicializado com zeros. Se o ponteiro for NULL, a rotina do lado do servidor receberá um ponteiro NULL .

Nessa situação, o tamanho máximo do ponteiro deve ser bem definido no tempo de compilação ou com base nos parâmetros de entrada, pois o servidor precisa alocar espaço para o local de memória que está sendo apontado. Por exemplo, um ponteiro [cadeia de caracteres] simples não tem um tamanho bem definido porque a cadeia de caracteres é terminada implicitamente por um caractere NULL. Nesse caso, especificar o tamanho máximo da cadeia de caracteres adicionando um atributo [size_is] atingiria o requisito de tamanho bem definido.

Exemplos

/* The MoveLeft function will move one position to the left and optionally return the previous position */
void MoveLeft([in, out, unique, partial_ignore] long *pPrevPosition);

Confira também

unique