La razón más probable para que aparezcan esas variables en la función es eliminar las advertencias sobre los argumentos no utilizados.
Sin embargo, dado que es probable que presente aún otra advertencia (ya que probablemente esté utilizando un nivel de advertencia más alto de lo normal), el autor da un paso adicional para eliminarlas también.
En C, la declaración
42;
es realmente válida, aunque no es muy útil. Si compila:
int main (void) {
42;
return 0;
}
no se quejará (normalmente). Sin embargo, si se compila con gcc -Wall -pedantic
que (por ejemplo), que obtendrá algo como:
prog.c: In function `main':
prog.c:2: warning: statement with no effect
porque el compilador, con razón, piensa que has vuelto loco.
Poner un molde (void)
antes de que algo que genera un valor, como el 42;
explícitamente indicará que no le importa el valor.
que he visto este utilizado en algunos compiladores anal retentiva, que insisten en que, debido a una función como printf
realidad devuelve un valor, debe estar loco para hacer caso de él, lo que lleva a tales atrocidades como:
(void)printf ("Hello, world.\n");
(void)strcpy (dest, src);
:-)
a modo de ejemplo, si se compila:
void some_func (char *foo) {}
int main (void) { some_func (0); return 0; }
con gcc -Wall -W -pedantic
, obtendrá:
warning: unused parameter `foo'
Si "utiliza" el parámetro:
void some_func (char *foo) { foo; }
obtendrá
warning: statement with no effect
Sin embargo, si se utiliza el parámetro y ignorar explícitamente el resultado:
void some_func (char *foo) { (void)foo; }
no recibirás ninguna advertencia.
Aunque podrían dejarse como recordatorio 'TODO'. – ruslik
Puede no ser un caso de algo que HAY QUE HACER: este podría ser el estado final del código. Por ejemplo, esta función podría ser una devolución de llamada, y esos parámetros realmente no se usan. –
"Asegurar" es un poco demasiado fuerte. Funcionará para algunos compiladores, pero aparentemente no es universal: http://herbsutter.com/2009/10/18/mailbag-shutting-up-compiler-warnings/ – jamesdlin