c - online - solidity español
Puntero de lanzamiento al vacío (2)
Cuando tu lo hagas
(void) p;
Usted le dice al compilador que simplemente ignore el resultado de la expresión p
. Es efectivamente lo mismo que una declaración vacía:
;
Cuando tu lo hagas
(void *) p;
Le dices al compilador que trate la variable p
como un puntero genérico, y esa es la expresión completa de la declaración, una expresión que realmente no hace nada y obtienes el mensaje de error.
¿Hay alguna diferencia en debajo de dos piezas fundidas?
int a=10;
int *p=&a;
(void)p; //does not give any warning or error
o
(void *)p; //error: statement with no effect [-Werror=unused-value]
cuando se cumple con gcc -Wall -Werror --std=c99 -pedantic
Acabo de ver eso en esta respuesta. (claramente entendí mal algo)
Si obviamente.
(void)p;
significa que el objeto se convierte a tipo de void
, (que no es un tipo completo) y que siendo la expresión completa, el resultado de la expresión no se debe usar, por lo tanto, el compilador no verifica su uso.
Citando el estándar C11
, capítulo 6.3.2.2, void
El valor (inexistente) de una expresión
void
(una expresión que tiene un tipo vacío) no se debe usar de ninguna manera, [......] Si una expresión de cualquier otro tipo se evalúa como una expresiónvoid
, su valor o el designador se descarta.
Entonces, no se genera ninguna advertencia o error.
OTOH,
(void *)p;
significa que el objeto es un puntero al tipo de void
, que es un tipo completo y debe usarse en su programa. En ese caso, el compilador informa correctamente sobre la no utilización del objeto fuera de la expresión.