Il motivo per non averlo utilizzato parametri nel prototipo è solitamente perché la funzione deve essere conforme a qualche API esterna - forse è una funzione di libreria, o un puntatore a quella funzione viene passato a un'altra funzione che si aspetta questa convenzione di chiamata. Tuttavia, non tutti gli argomenti utilizzati dalla convenzione di chiamata sono effettivamente necessari nella funzione stessa.
Il motivo per menzionare il nome del parametro nel corpo è per evitare avvisi come
unused.c: In function ‘l_alloc’:
unused.c:3:22: warning: unused parameter ‘ud’ [-Wunused-parameter]
void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
^~
Questo avviso può essere soppresso utilizzando il parametro effettivo nel corpo della funzione. Ad esempio, se hai la seguente dichiarazione:
ud;
Questo avviso è ora soppresso. Tuttavia ora GCC produrrà un altro avviso:
unused.c:5:5: warning: statement with no effect [-Wunused-value]
ud;
^~
Questo avviso dice che l'affermazione ud;
, pur essendo sintatticamente valida C, non ha alcun effetto su nulla, ed è forse un errore, non diversamente dall'affermazione
abort;
che forse avrebbe dovuto essere scritto come abort();
invece per fare qualcosa.
Ed è qui che (void)
entra in gioco il cast: dirà al compilatore in modo inequivocabile ed esplicito che l'affermazione non dovrebbe avere assolutamente alcun effetto.