tutorial online español curso aprender c pointers void

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ón void , 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.