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?

¿Fue útil?

Solución

En C:

  • void foo() significa "una función foo tomando un número no especificado de argumentos de tipo no especificado"
  • void foo(void) significa "una función foo sin aceptar argumentos"

En C++:

  • void foo() significa "una función foo sin aceptar argumentos"
  • void foo(void) significa "una función foo 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top