Compartir a través de


atributo partial_ignore

El atributo ACF [partial_ignore] define una versión especializada de punteros [únicos] que proporciona semántica de salida opcional.

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

Observaciones

Al crear una función, es habitual permitir a los usuarios especificar un puntero distinto de NULL a datos devueltos opcionales, a menudo denominado puntero opcional de salida. La memoria a la que apunta el usuario no suele ser necesaria para inicializarse. Esta técnica representa un problema cuando la función se usa a través de RPC.

Si el puntero opcional de salida es válido, pero apunta a datos no inicializados, RPC intenta calcular las referencias de esos datos y enviarlos al servidor, lo que puede hacer que se produzca un error en la serialización y anular la llamada. Incluso si la serialización se realiza correctamente, se envía una cantidad potencialmente grande de datos inútiles al servidor.

Estos problemas se resuelven marcando el puntero como [in, out, unique, partial_ignore]. Los cuatro atributos deben estar presentes. Cuando se serializa un puntero [partial_ignore] en el lado cliente, los únicos datos enviados al servidor son un indicador que muestra si el puntero es NULL. Si el puntero no es NULL, la rutina del lado servidor recibe un puntero válido a un bloque de memoria que se ha inicializado con ceros. Si el puntero es NULL, la rutina del lado servidor recibe un puntero NULL .

En esta situación, el tamaño máximo del puntero debe definirse bien en tiempo de compilación o en función de los parámetros de entrada, ya que el servidor debe asignar espacio para la ubicación de memoria a la que se apunta. Por ejemplo, un puntero simple [string] no tiene un tamaño bien definido porque la cadena finaliza implícitamente por un carácter NULL. En este caso, especificar el tamaño máximo de la cadena agregando un atributo [size_is] lograría el requisito de tamaño bien definido.

Ejemplos

/* 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);

Vea también

unique