¿Existe alguna diferencia entre foo(void) y foo() en C++ o C?
Pregunta
Considere estas dos definiciones de funciones:
void foo() { }
void foo(void) { }
¿Hay alguna diferencia entre estos dos?Si no, ¿por qué void
argumento ahí?¿Razones estéticas?
Solución
En C:
void foo()
significa "una funciónfoo
tomando un número no especificado de argumentos de tipo no especificado"void foo(void)
significa "una funciónfoo
sin aceptar argumentos"
En C++:
void foo()
significa "una funciónfoo
sin aceptar argumentos"void foo(void)
significa "una funciónfoo
sin aceptar argumentos"
Al escribir foo(void)
, por lo tanto, logramos la misma interpretación en ambos idiomas y hacemos que nuestros encabezados sean multilingües (aunque normalmente necesitamos hacer algunas cosas más en los encabezados para que sean verdaderamente multilingües;es decir, envolverlos en un extern "C"
si estamos compilando C++).
Otros consejos
Me doy cuenta de que su pregunta se refiere a C++, pero cuando se trata de C, la respuesta se puede encontrar en K&R, páginas 72-73:
Además, si una declaración de función no incluye argumentos, como en
double atof();
Eso también se considera que no se debe asumir nada sobre los argumentos de ATOF;toda la verificación de parámetros está desactivada.Este significado especial de la lista de argumentos vacíos está destinado a permitir que los programas C más antiguos se compilen con nuevos compiladores.Pero es una mala idea usarlo con nuevos programas.Si la función toma argumentos, declararlos;Si no requiere argumentos, use el vacío.
Borrador del estándar C++11 N3337
No hay diferencia.
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
Anexo C “Compatibilidad” C.1.7 Cláusula 8:declaradores dice:
8.3.5 Cambio:En C++, una función declarada con una lista de parámetros vacía no toma argumentos.En C, una lista de parámetros vacías significa que el número y el tipo de argumentos de la función son desconocidos.
Ejemplo:
int f(); // means int f(void) in C ++ // int f( unknown ) in C
Razón fundamental:Esto es para evitar llamadas de funciones erróneas (es decir, llamadas de función con el número incorrecto o el tipo de argumentos).
Efecto sobre la característica original:Cambie a la semántica de una característica bien definida.Esta característica fue marcada como "obsoleta" en C.
8.5.3 funciones dice:
4.La cláusula de DE-Declaración de parámetros determina los argumentos que se pueden especificar, y su procesamiento, cuando se llama a la función....] Si la cláusula de DECLACIÓN DE PARAMETER está vacía, la función no toma argumentos.La lista de parámetros (nula) es equivalente a la lista de parámetros vacía.
C99
Como lo menciona C++ 11, int f()
no especifica nada sobre los argumentos y es obsoleto.
Puede conducir a un código de trabajo o a UB.
He interpretado detalladamente el estándar C99 en: https://stackoverflow.com/a/36292431/895245
En C, se utiliza un vacío en una referencia de función vacía para que el compilador tenga un prototipo y ese prototipo "no tenga argumentos".En C++, no es necesario decirle al compilador que tiene un prototipo porque no puede omitirlo.