Comprender la diferencia entre f () yf (vacío) en C y C ++ de una vez por todas

Ok, entonces he escuchado diferentes opiniones sobre este tema y solo quiero asegurarme de que lo entiendo correctamente.

Para C ++

Declaracionesvoid f(); yvoid f(void); Significa precisamente lo mismo, la función.f No toma ningún parámetro. Lo mismo ocurre con las definiciones.

Para c

Declaraciónvoid f(void); significa quef No toma ningún parámetro.

Declaraciónvoid f(); significa que la funciónf puede o no tener parámetros, y si los tiene, no sabemos qué tipo de parámetros son, o cuántos hay de ellos. Tenga en cuenta que NO es lo mismo que los puntos suspensivos, no podemos usarva_list.

Ahora aquí es donde las cosas se ponen interesantes.

Caso 1

Declaración:

void f();

Definición:

void f(int a, int b, float c)
{
   //...
}
Caso 2

Declaración:

void f();

Definición:

void f()
{
   //...
}
Pregunta:

¿Qué sucede en tiempo de compilación en los casos 1 y 2 cuando llamamos?f ¿Con los argumentos correctos, argumentos erróneos y sin argumentos en absoluto? ¿Qué sucede en el tiempo de ejecución?

Pregunta adicional:

Si declarof con argumentos, pero defínalo sin ellos, ¿hará una diferencia? ¿Debo poder abordar los argumentos del cuerpo de la función?