En algún proyecto de C, he visto este código:
static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
(void)ud;
(void)osize;
/* some code not using `ud` or `osize` */
return ptr;
}
¿Los dos yesos para anular sirven para algo?
(void)
con un efecto algo diferente. Esta pregunta es sobre CRespuestas:
Está ahí para evitar advertencias del compilador porque algunos parámetros no se utilizan.
fuente
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
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:
Esta advertencia ahora está suprimida. Sin embargo, ahora GCC producirá otra advertencia:
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ónque 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.fuente