¿Qué significa vacío en C, C++ y C#?


Buscando obtener los fundamentos sobre de dónde viene el término " vacío", y por qué se llama vacío. La intención de la pregunta es ayudar a alguien que no tiene experiencia en C, y de repente está mirando una base de código basada en C.

Author: edmond, 2009-06-25

15 answers

Básicamente significa "nada" o "ningún tipo"

Hay 3 formas básicas de usar void:

  1. Argumento de función: int myFunc(void) -- la función no toma nada.

  2. Valor de retorno de la función: void myFunc(int) -- la función devuelve nada

  3. Puntero de datos genérico: void* data -- 'data' es un puntero a datos de tipo desconocido, y no se puede desreferenciar

Nota: el void en un argumento de función es opcional en C++, por lo que int myFunc() es exactamente el igual que int myFunc(void), y se omite completamente en C#. Siempre se requiere para un valor devuelto.

 203
Author: Gerald,
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
2014-10-15 15:11:10

Siempre lo he tomado como ausente . Aquí hay cuatro casos en el lenguaje C que coinciden con este uso de absent

  • R f(void) - Los parámetros de la función están ausentes
  • void f(P) - El valor devuelto es ausente
  • void *p - El tipo de lo que se señala está ausente
  • (void) p - El uso del valor está ausente

Otros descendientes de C lo usan para otras cosas. El lenguaje de programación D lo usa para casos en los que un inicializador está ausente

  • T t = void; - el valor de inicialización es ausente
 23
Author: Johannes Schaub - litb,
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
2009-06-25 14:23:12

Significa "sin valor". Utilice void para indicar que una función no devuelve un valor o que no tiene parámetros o ambos. Bastante consistente con los usos típicos de word void en inglés.

 13
Author: sharptooth,
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
2009-06-25 10:06:51

Hay dos formas de usar void:

void foo(void);

O

void *bar(void*);

El primero indica que no se está pasando ningún argumento o que no se está devolviendo ningún argumento.

El segundo le dice al compilador que no hay ningún tipo asociado con los datos, lo que significa que no puede hacer uso de los datos apuntados hasta que se castea a un tipo conocido.

Por ejemplo, verá que void* se usa mucho cuando tiene una interfaz que llama a una función cuyos parámetros no se pueden conocer antes de tiempo.

Por ejemplo, en el Kernel de Linux, cuando aplace el trabajo, configurará una función que se ejecutará en un momento posterior dándole un puntero a la función que se ejecutará y un puntero a los datos que se pasarán a la función:

struct _deferred_work {
sruct list_head mylist;
.worker_func = bar;
.data        = somedata;
} deferred_work;

Entonces un hilo del kernel repasa una lista de trabajo diferido y cuando llega a este nodo ejecuta efectivamente:

bar(somedata);

Entonces en bar tienes:

void bar(void* mydata) {
    int *data = mydata;
    /* do something with data */;
}
 11
Author: Robert S. Barnes,
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
2013-10-01 17:29:10

Indica la ausencia de un valor devuelto en una función.

Algunos lenguajes tienen dos tipos de subrutinas: procedimientos y funciones. Los procedimientos son solo una secuencia de operaciones, mientras que una función es una secuencia de operaciones que devuelven un resultado.

En C y sus derivadas, la diferencia entre los dos no es explícita. Todo es básicamente una función. la palabra clave void indica que no es una función "real", ya que no devuelve un valor.

 4
Author: Rik,
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
2009-06-25 10:15:38

Piense en void como la "estructura vacía". Déjame explicarte.

Cada función toma una secuencia de parámetros, donde cada parámetro tiene un tipo. De hecho, podríamos empaquetar los parámetros en una estructura, con las ranuras de estructura correspondientes a los parámetros. Esto hace que cada función tenga exactamente un argumento. Del mismo modo, las funciones producen un resultado, que tiene un tipo. Podría ser un booleano, o podría ser float, o podría ser una estructura, conteniendo un conjunto arbitrario de otros valores tipificados. Si queremos un lenguaje que tiene múltiples valores de retorno, es fácil insistir en que se empaqueten en una estructura. De hecho, siempre podríamos insistir en que una función devuelve una estructura. Ahora cada función toma exactamente un argumento y produce exactamente un valor.

Ahora, ¿qué sucede cuando necesito una función que produce un valor "no"? Bueno, considere lo que obtengo cuando formo una estructura con 3 ranuras: contiene 3 valores. Cuando tengo 2 ranuras, tiene dos valores. Cuando se tiene una ranura, un valor. Y cuando tiene cero ranuras, se mantiene... uh, valores cero, o "sin" valor". Por lo tanto, puedo pensar en una función que devuelve void como devolver una estructura que no contiene valores. Incluso se puede decidir que " vacío" es solo un sinónimo para el tipo representado por la estructura vacía, en lugar de una palabra clave en el lenguaje (tal vez es solo un tipo predefinido :)

Del mismo modo, puedo pensar en una función que no requiere valores como aceptar una estructura vacía, por ejemplo, "void".

Puedo incluso implementar mi lenguaje de programación de esta manera. Pasar un valor nulo ocupa cero bytes, por lo que pasar valores de vacío es solo un caso especial de pasar otros valores de tamaño arbitrario. Esto hace que sea fácil para el compilador tratar el resultado o argumento" void". Probablemente quieras una función de idioma que puede arrojar un resultado de función; en C, si llama al resultado no vacío función foo en la siguiente declaración: foo(...); el compilador sabe que foo produce un resultado y simplemente ignora se. Si void es un valor, esto funciona perfectamente y ahora "procedimientos" (que son solo un adjetivo para una función con resultado nulo) son solo trivial special casos de funciones generales.

Void* es un poco más divertido. No creo que los diseñadores de C pensaran en el vacío en el arriba; acaban de crear una palabra clave. Esa palabra clave estaba disponible cuando alguien necesitaba un punto para un tipo arbitrario, por lo tanto void* como el modismo en C. En realidad funciona bastante bien si interpretas void como una estructura vacía. Un void * pointer es la dirección de un lugar donde esa estructura vacía tiene ha sido puesto.

Lanza desde void* a T* para otros tipos T, también funciona con esta perspectiva. Los Pointer casts son un truco completo que funciona en la mayoría de las arquitecturas comunes para aprovechar el hecho de que si un tipo compuesto T tiene un elemento con el subtipo S colocado físicamente al principio de T en su diseño de almacenamiento, entonces el lanzamiento de S* a T* y viceversa usando la misma dirección física de la máquina tiende a funcionar, ya que la mayoría de los punteros de máquina tienen una sola representación. Reemplazar el tipo S por el tipo void da exactamente el mismo efecto, y por lo tanto el lanzamiento hacia/desde void* funciona.

El lenguaje de programación PARLANSE implementa las ideas anteriores muy de cerca. Nos equivocamos en su diseño, y no prestamos mucha atención a "void" como un retorno escriba y, por lo tanto, tenga palabras clave de idioma para el procedimiento. Es sobre todo un simple cambio de sintaxis, pero es una de las cosas que usted no consigue alrededor de una vez que usted consigue un cuerpo grande código de trabajo en un idioma.

 3
Author: Ira Baxter,
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
2009-06-29 21:53:43

En c# usarías la palabra clave void para indicar que un método no devuelve un valor:

public void DoSomeWork()
{
//some work
}
 2
Author: Charlie,
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
2009-06-25 10:09:32

Tres casos de uso para void:

  1. Firmas de función. void foo(int bar) no devuelve un valor. int bar(void) no toma ningún parámetro, pero esto generalmente se expresa con una lista de argumentos vacía: int bar(). El uso de la palabra clave void aquí corresponde a su significado en inglés.

  2. Puntero genérico de tipo superior void * que apunta a datos no especificados y no se puede desreferenciar. Aquí el significado de vacío es diferente de otros significados de vacío: tipo universal vs. no tipo.

  3. En moldes como (void) new Foo(this) para significar que el valor de retorno es deliberadamente desechado. Aquí el uso de la palabra clave también coincide con su significado en inglés.

Los casos 1 y 2 ya fueron cubiertos por @Gerald, pero el caso 3 aún no ha sido abordado.

 2
Author: laalto,
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
2009-06-25 11:20:36

Si está explicando el concepto a un principiante, podría ser útil usar una analogía. El uso de void en todos estos casos es análogo en significado a una página en un libro que tiene las siguientes palabras, "Esta página dejada intencionalmente en blanco."Es diferenciar al compilador entre algo que debe ser marcado como un error, versus un tipo que es intencionalmente dejado en blanco porque ese es el comportamiento que desea.

Siempre aparece en el código donde normalmente esperarías para ver aparecer un tipo, como un tipo de retorno o un tipo de puntero. Esta es la razón por la que en C#, void mapea a un sistema de tipo CLR real.Vacío porque es un tipo en sí mismo.

Algunos lenguajes de programación nunca desarrollaron el concepto de vacío, al igual que algunas culturas humanas nunca inventaron el concepto del número cero. Void representa el mismo avance en un lenguaje de programación que el concepto de cero representa para el lenguaje humano.

 2
Author: TimF,
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
2009-06-25 12:11:27

Significa "sin valor". Usa void para indicar que una función no devuelve un valor o que no tiene parámetros o both.It es muy consistente con los usos típicos de la palabra void en inglés.

Void no debe confundirse con null. Null significa que para la variable cuya dirección está en la pila, el valor en el montón para esa dirección está vacío.

 1
Author: AVI,
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
2015-12-28 03:28:43

Void se usa solo en las firmas de método. Para los tipos de devolución significa que method no devolverá nada al código de llamada. Para los parámetros significa que no se pasan parámetros al método

Por ejemplo

void MethodThatReturnsAndTakesVoid(void)
{
// Method body
}

En C# podemos omitir el void para los parámetros y podemos escribir el código anterior como:

void MethodThatReturnsAndTakesVoid()
{
// Method body
}

Void no debe confundirse con null. Null significa que para la variable cuya dirección está en la pila, el valor en el montón para esa dirección está vacío.

 0
Author: Rashmi Pandit,
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
2009-06-25 10:12:06

Void es un tipo incompleta que por definición no puede ser un lvalue. Lo que significa que no se le puede asignar un valor.

Así que tampoco puede contener ningún valor.

 0
Author: dhein,
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
2014-10-15 14:49:21

Void significa que no devolverá ningún valor de la función o método

 -1
Author: Hannoun Yassir,
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
2009-06-25 10:21:07

Void significa que no se requiere ningún valor en el tipo de retorno de una función en los tres idiomas.

 -1
Author: Nakul Chaudhary,
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
2009-06-25 10:32:28

Void es el equivalente del Sub de Visual Basic.

 -1
Author: cyclo,
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
2009-06-25 11:43:37