attributo partial_ignore
L'attributo ACF [partial_ignore] definisce una versione specializzata di puntatori [unique] che fornisce semantica facoltativa.
[ [function-attribute-list <>] ] type-specifier <> [pointer- <>declarator <>] function-name <>( [ partial_ignore [ , parameter-attribute-list <> ] ] type-specifier <> [declarator <>] , ...);
Commenti
Quando si crea una funzione, è comune consentire agli utenti di specificare un puntatore non NULL ai dati restituiti facoltativi, spesso definiti puntatori facoltativi. La memoria a cui punta l'utente non è in genere necessaria per l'inizializzazione. Questa tecnica rappresenta un problema quando la funzione viene usata su RPC.
Se il puntatore facoltativo è valido, ma punta a dati non inizializzati, RPC tenta di effettuare il marshalling dei dati e di inviarli al server, causando l'esito negativo del marshalling e l'interruzione della chiamata. Anche se il marshalling riesce, al server viene inviata una quantità potenzialmente elevata di dati inutili.
Questi problemi vengono risolti contrassegnando il puntatore come [in, out, unique, partial_ignore]. Tutti e quattro gli attributi devono essere presenti. Quando viene eseguito il marshalling di un puntatore [partial_ignore] sul lato client, gli unici dati inviati al server sono un indicatore che indica se il puntatore è NULL. Se il puntatore non è NULL, la routine lato server riceve un puntatore valido a un blocco di memoria inizializzato con zeri. Se il puntatore è NULL, la routine lato server riceve un puntatore NULL .
In questo caso, le dimensioni massime del puntatore devono essere ben definite in fase di compilazione o in base ai parametri di input, perché il server deve allocare spazio per la posizione di memoria a cui punta. Ad esempio, un puntatore [stringa] semplice non ha una dimensione ben definita perché la stringa viene terminata in modo implicito da un carattere NULL. In questo caso, specificando la dimensione massima della stringa aggiungendo un attributo [size_is] si otterrebbe il requisito di dimensione ben definito.
Esempi
/* 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);
Vedere anche