stringtranslate.com

Tipo de vacío

El tipo void , en varios lenguajes de programación derivados de C y Algol68 , es el tipo de retorno de una función que retorna normalmente, pero no proporciona un valor de resultado a quien la llama. Generalmente, estas funciones se llaman por sus efectos secundarios , como realizar alguna tarea o escribir en sus parámetros de salida. El uso del tipo void en dicho contexto es comparable a los procedimientos en Pascal y a las construcciones sintácticas que definen subrutinas en Visual Basic . También es similar al tipo de unidad utilizado en los lenguajes de programación funcional y en la teoría de tipos. Consulte Tipo de unidad#En lenguajes de programación para ver una comparación.

C y C++ también admiten el puntero al tipo void (especificado como void *), pero se trata de una noción no relacionada. Las variables de este tipo son punteros a datos de un tipo no especificado , por lo que en este contexto (pero no en los demás) actúa aproximadamente como un tipovoid * universal o superior . Un programa puede convertir un puntero a cualquier tipo de datos (excepto un puntero de función ) en un puntero a void y volver al tipo original sin perder información, lo que hace que estos punteros sean útiles para funciones polimórficas . El estándar del lenguaje C no garantiza que los diferentes tipos de punteros tengan el mismo tamaño o alineación.

En C y C++

Una función con un tipo de resultado void finaliza ya sea alcanzando el final de la función o ejecutando una sentencia return sin valor devuelto. El tipo void también puede reemplazar la lista de argumentos de un prototipo de función para indicar que la función no acepta argumentos. Tenga en cuenta que en todas estas situaciones, void no es un calificador de tipo en ningún valor. A pesar del nombre, esto es semánticamente similar a un tipo de unidad implícito , no a un tipo cero o inferior (que a veces se denomina confusamente "tipo void"). A diferencia de un tipo de unidad real que es un singleton, el tipo void carece de una forma de representar su valor y el lenguaje no proporciona ninguna forma de declarar un objeto o representar un valor con el tipo void.

En las primeras versiones de C, las funciones sin un resultado específico tenían como valor predeterminado un tipo de retorno de inty las funciones sin argumentos simplemente tenían listas de argumentos vacías. Los punteros a datos sin tipo se declaraban como enteros o punteros a char. Algunos compiladores de C tempranos tenían la característica, ahora vista como una molestia, de generar una advertencia en cualquier llamada de función que no usara el valor devuelto de la función. El código antiguo a veces convierte dichas llamadas de función en void para suprimir esta advertencia. Cuando Bjarne Stroustrup comenzó su trabajo en C++ en 1979-1980, [ cita requerida ] void y los punteros void eran parte del dialecto del lenguaje C compatible con los compiladores derivados de AT&T. [1]

El uso explícito de void frente a no proporcionar argumentos en un prototipo de función tiene una semántica diferente en C y C++, como se detalla en la siguiente tabla: [2]

La sintaxis C para declarar una función (no variádica) con un número de parámetros aún no especificado, por ejemplo, void f()la anterior, quedó obsoleta en C99 . [3] En C23 (y C++), un prototipo de función con paréntesis vacíos declara una función con cero parámetros. [4] [5]

En Haskell

A diferencia de C++, en el lenguaje de programación funcional Haskell el tipo void denota el tipo vacío , que no tiene habitantes [1]. Una función en el tipo void no devuelve resultados, y un programa con efectos secundarios y firma de tipo IO Void no termina ni se bloquea. En particular, no existen funciones totales en el tipo void.

Referencias

  1. ^ Ritchie, Dennis M. (1993). "El desarrollo del lenguaje C". Association for Computing Machinery, Inc. a través del autor y Lucent Technologies Inc. 1996. Archivado desde el original el 20 de febrero de 1998.
  2. ^ Stroustrup, Bjarne (2009). Programación: principios y práctica con C++ . Boston: Addison-Wesley. pág. 996. ISBN. 978-0-321-54372-1.
  3. ^ Bjarne Stroustrup, C y C++: estudios de casos de compatibilidad. ¿Diferencias reconciliables? Usted decide , Dr. Dobb's , 1 de septiembre de 2002; versión impresa
  4. ^ "WG14-N2432: Propuesta de eliminar la compatibilidad con definiciones de funciones con listas de identificadores" (PDF) . open-std.org . 25 de septiembre de 2019. Archivado (PDF) del original el 27 de diciembre de 2022.
  5. ^ "WG14-N2841: No se permiten declaradores de funciones sin prototipos". open-std.org . 2021-10-10. Archivado desde el original el 12 de noviembre de 2022.