Hablando funcional y sintácticamente, ¿hay alguna diferencia entre una función cuyo prototipo es int foo(void)
y int foo(void *)
?
Sé la diferencia entre, por ejemplo, int bar(int)
y int bar(int *)
- uno de ellos está buscando un int, y el otro está buscando un puntero int. ¿Se void
comporta de la misma manera?
c++
c
function-prototypes
Nick Reed
fuente
fuente
foo(void)
yfoo()
.Respuestas:
A partir de esta respuesta sobre Ingeniería de Software,
void
se trata especialmente dependiendo de cómo se use. EnC
yC++
,void
se usa para indicar la ausencia de un tipo de datos, mientras quevoid *
se usa para indicar un puntero que apunta a algunos datos / espacio en la memoria que no tiene un tipo.void *
no se puede desreferenciar por sí solo, y primero se debe convertir a otro tipo. Este reparto no necesita ser explícito enC
, pero debe ser explícito enC++
. (Es por eso que no arrojamos el valor de retorno de malloc, que esvoid *
).Cuando se usa con una función como parámetro,
void
significa la ausencia total de cualquier parámetro, y es el único parámetro permitido. Intentar usar void como un tipo de variable o incluir otros argumentos da como resultado un error del compilador:Es igualmente imposible declarar una variable con tipo
void
:void
como un valor de retorno para una función indica que no se devolverán datos. Como es imposible declarar una variable de tipovoid
, es imposible capturar el valor de retorno de unavoid
función, incluso con un puntero nulo.El sin tipo
void *
es un caso diferente. Un puntero nulo indica un puntero a una ubicación en la memoria, pero no indica el tipo de datos en ese puntero. (Esto se usa para lograr el polimorfismo en C , como con la función qsort ()) . Sin embargo, estos punteros pueden ser difíciles de usar, ya que es muy fácil lanzarlos accidentalmente al tipo incorrecto. El siguiente código no arrojará ningún error del compiladorC
, pero da como resultado un comportamiento indefinido:El siguiente código, sin embargo, es perfectamente legal; lanzar hacia y desde un puntero vacío nunca cambia el valor que tiene.
Como parámetro de función,
void *
indica que se desconoce el tipo de datos en el puntero que está pasando, y depende de usted, el programador, manejar adecuadamente lo que esté en esa ubicación de memoria. Como valor de retorno,void *
indica que el tipo de datos que se devuelve no se conoce o no tiene tipo, y el programa debe manejarlo.tl; dr
void
en un prototipo de función significa "sin datos" e indica que no hay valor de retorno o ningún parámetro,void *
en un prototipo de función significa que "los datos en el puntero que se da esta función no tienen un tipo conocido" e indica un parámetro o valor de retorno cuyo puntero debe convertirse a un tipo diferente antes de que se puedan utilizar los datos en el puntero.fuente
void * ... must be cast to another type first, but may be done so without an explicit cast.
No es cierto en C ++. En C ++, la forma de conversiónvoid*
debe ser explícita. PS que llama a un cast explícito es redundante, ya que el cast es, por definición, una conversión explícita.foo(void)
- función sin parámetrosfoo(void *)
- función con unvoid *
parámetro¿Qué es
void *
? Es solo el puntero a los datos sin un tipo especificado. Se puede lanzar a cualquier otro tipo de punterofuente
(type) vs. (type *)
universo de las parejas porque el vacío no es realmente un tipo.Hay una diferencia:
int foo(void)
declara una función que no acepta argumentos.int foo(void *)
declara una función que acepta un solo argumento de tipovoid*
.En C ++,
int foo(void)
es equivalente aint foo()
.fuente