Usando “vacío” en C

Estoy confundido acerca de por qué necesitamos pasar el void a las funciones de C:

 int f(void) { return 0; } 

versus

 int f() { return 0; } 

¿Qué es lo correcto y por qué?

En C, int f() es una statement de estilo antiguo. Dice que f espera un número y tipo de argumentos fijos pero no especificados. Por ejemplo, dado int f() { return 0; } int f() { return 0; } , el comstackdor no se quejará de f(42) , o de f("hello, world") (aunque el comportamiento de tal llamada no está definido).

int f(void) dice explícitamente que f no toma argumentos.

(C ++ tiene reglas diferentes; Stroustrup no estaba tan preocupado por la compatibilidad con versiones anteriores con el código C antiguo).

Es un vestigio de C.

f(void) no toma argumentos, por lo que f(1) no es válido.

f() significa que los parámetros no están especificados, por lo que f(1) es válido aquí.

El void en este caso simplemente significa “no hay parámetros”. No estoy seguro de si su segundo caso se comstackrá, pero de cualquier manera preferiría que el primer caso sea lo más claro posible. Por supuesto, al llamar a f , solo usas los paréntesis vacíos:

 int x = f();