El motivo de tener parámetros no utilizados en el prototipo suele ser porque la función debe ajustarse a alguna API externa; tal vez sea una función de biblioteca, o un puntero a esa función se pasa a otra función que espera esta convención de llamada. Sin embargo, no todos los argumentos utilizados por la convención de llamada son realmente necesarios en la función en sí.
La razón para mencionar el nombre del parámetro en el cuerpo es para evitar advertencias como
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) {
^~
Esta advertencia se puede suprimir utilizando el parámetro real en el cuerpo de la función. Por ejemplo, si tiene la siguiente declaración:
ud;
Esta advertencia ahora está suprimida. Sin embargo, ahora GCC producirá otra advertencia:
unused.c:5:5: warning: statement with no effect [-Wunused-value]
ud;
^~
Esta advertencia dice que la declaración ud;
, aunque es sintácticamente válida C, no afecta nada en absoluto, y posiblemente sea un error, no muy diferente de la declaración
abort;
que quizás debería haber sido escrito como en abort();
cambio para que hiciera algo.
Y ahí es donde (void)
entra el elenco: le dirá al compilador de manera inequívoca y explícita que se supone que la declaración no tiene ningún efecto en absoluto.