retorno - `f(void)` ¿significa que no hay parámetros en C++ 11 o C?
tipos de funciones en c (5)
En C ++ 11 la siguiente declaración de función:
int f(void);
significa lo mismo que
int f();
Una lista de parámetros que consiste en un único parámetro sin nombre de tipo no dependiente void es equivalente a una lista de parámetros vacía.
Tengo la impresión (quizás falsa) de que esta es una característica antigua, ¿tal vez heredada de C?
¿Alguien sabe la historia o los fundamentos de esta forma de declarar una función sin parámetros?
De "A History of C ++" (1979–1991 de Bjarne Stroustrup) en p11:
C con Clases introdujo la notación f (nula) para una función f que no toma argumentos como contraste con f () que en C declara una función que puede tomar cualquier número de argumentos de cualquier tipo sin ninguna verificación de tipo.
Sin embargo, luego dice que pronto al declarador de función vacía se le dio su significado obvio y el nuevo constructo, algo que quedó obsoleto para la época. Supongo que nadie se ha molestado en eliminarlo después (o tal vez ya había escrito algún código C ++ que necesitaba soporte).
Cía:
Sin embargo, este constructo representó un papel importante a partir de la estandarización del lenguaje C, donde la creación de prototipos de funciones se tomó prestada directamente de C ++. En este caso, f(void)
fue útil para admitir el código C existente (en el que la noción f()
ya estaba reservada para indicar una función que toma un número de argumentos no especificado).
Antes de eso, el lenguaje C no había podido adjuntar tipos específicos a cada parámetro, pero solo las funciones con un número no especificado de argumentos y con tipos no especificados se podían declarar utilizando el formulario f()
.
En C ++ ambos significan lo mismo.
En C f(void)
es diferente de f()
, porque f()
significa "parámetros no especificados": puede pasar cualquier cosa legalmente (ya sea que la función de recibir los datos esté contenta o no sea otra cosa).
En C ++ ambos son lo mismo.
En C, f()
significa que no sabemos cuántos parámetros toma la función en este punto. Se trata de parámetros no especificados. Y f(void)
significa que esta función no toma ningún parámetro.
De la norma C:
6.7.6.3 Declaradores de funciones (incluyendo prototipos)
6 / Una lista de tipos de parámetros especifica los tipos de, y puede declarar identificadores para, los parámetros de la función.
10 / El caso especial de un parámetro sin nombre de tipo
void
como único elemento en la lista especifica que la función no tiene parámetros.14 / Una lista de identificadores declara solo los identificadores de los parámetros de la función. Una lista vacía en un declarador de función que forma parte de una definición de esa función especifica que la función no tiene parámetros. La lista vacía en un declarador de función que no forma parte de una definición de esa función especifica que no se proporciona información sobre el número o los tipos de parámetros.
Y como dijiste, en el estándar C ++:
8.3.5 Funciones [dcl.fct]
4 / La cláusula de declaración de parámetros determina los argumentos que se pueden especificar y su procesamiento cuando se llama a la función. [ Nota: * la cláusula-declaración-parámetro * se utiliza para convertir los argumentos especificados en la llamada a la función; ver 5.2.2. - nota final ] Si la cláusula-declaración-parámetro está vacía, la función no toma argumentos. Una lista de parámetros que consiste en un único parámetro sin nombre de tipo no dependiente
void
es equivalente a una lista de parámetros vacía.
En C ++, no hay diferencia. Sin embargo, esto se hereda de C, donde int f()
significa "función que puede tomar cualquier número de argumentos de cualquier tipo" e int f(void);
Especifica funciones que no tiene argumentos.
Editar Como señaló Angew, en C, f () significa " función cuyos parámetros son desconocidos en este momento ". No significa que pueda tomar cualquier número de argumentos; cerca de eso sería f(T arg, ...)
, donde arg
es al menos un parámetro con nombre antes de ...
, que acepta al menos un argumento, arg
(como señalado por @hvd).
Esto viene a C ++ de C. En C f()
significa número y tipo de parámetros desconocidos . Así que en C para ningún parámetro hay f( void )
.
En C ++ es redundante: f()
y f( void )
significan lo mismo, una función que no tiene parámetros.