¿Por qué convertir un valor de parámetro de función no utilizado en void?


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;
}

¿Sirven los dos moldes para el vacío para algún propósito?

Author: Antti Haapala, 2011-01-10

2 answers

Está ahí para evitar advertencias del compilador porque algunos parámetros no se usan.

 74
Author: Benoit Thiery,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-10 14:19:03

La razón por la que tiene parámetros no utilizados en el prototipo es generalmente porque la función necesita 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 invocadora son realmente necesarios en la propia función.

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 usando 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 instrucción ud;, mientras que es sintácticamente válida C, no afecta nada en absoluto, y es posiblemente un error, no a diferencia de la instrucción

abort;

Que tal vez debería haber sido escrito como abort(); en lugar de hacer algo.

Y ahí es donde entra en juego (void) - le dirá al compilador inequívoca y explícitamente que se supone que la declaración no tiene absolutamente ningún efecto.

 6
Author: Antti Haapala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-24 07:16:55