¿Hay alguna diferencia entre foo (void) y foo () en C ++ o C?

Considere estas dos definiciones de funciones:

void foo() { } void foo(void) { } 

¿Hay alguna diferencia entre estos dos? Si no, ¿por qué el argumento void allí? Razones estéticas?

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 argumentos”

En C ++ :

  • void foo() significa “una función foo sin argumentos”
  • void foo(void) significa “una función foo sin 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 por lo general necesitamos hacer más cosas en los encabezados para que sean realmente de otro idioma, es decir, envolverlos en un idioma extern "C" si estamos comstackndo C ++).

Me doy cuenta de que su pregunta pertenece a C ++, pero cuando se trata de C, la respuesta se puede encontrar en K & R, páginas 72-73:

Además, si una statement de función no incluye argumentos, como en

 double atof(); 

eso también se interpreta como que no se debe asumir nada sobre los argumentos de atof; toda verificación de parámetros está desactivada. Este significado especial de la lista de argumentos vacíos está destinado a permitir que los progtwigs anteriores de C compilen con comstackdores nuevos. Pero es una mala idea usarlo con nuevos progtwigs. Si la función toma argumentos, declarelos; si no requiere argumentos, use void.

Calado 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 contiene argumentos. En C, una lista de parámetros vacía significa que el número y el tipo de los argumentos de la función son desconocidos.

Ejemplo:

 int f(); // means int f(void) in C ++ // int f( unknown ) in C 

Justificación: Esto es para evitar llamadas a funciones erróneas (es decir, llamadas a funciones con un número o tipo de argumentos incorrectos).

Efecto en la función original: cambio a la semántica de la función bien definida. Esta característica fue marcada como “obsoleta” en C.

8.5.3 funciones dice:

4. La cláusula parameter-declaration-determina los argumentos que se pueden especificar, y su procesamiento, cuando se llama a la función. […] Si la cláusula-statement-parámetro está vacía, la función no tiene argumentos. La lista de parámetros (void) es equivalente a la lista de parámetros vacía.

C99

Como se menciona en C ++ 11, int f() no especifica nada sobre los argumentos, y es obsoleto.

Puede conducir al código de trabajo o al UB.

He interpretado el estándar C99 en detalle en: https://stackoverflow.com/a/36292431/895245

En C, usa un vacío en una referencia de función vacía para que el comstackdor tenga un prototipo y ese prototipo no tenga “argumentos”. En C ++, no tienes que decirle al comstackdor que tienes un prototipo porque no puedes dejar de lado el prototipo.