Entendendo a diferença entre f () ef (void) em C e C ++ de uma vez por todas

Ok, então eu ouvi diferentes opiniões sobre este assunto e apenas quero ter certeza que entendi corretamente.

Para C ++

Declaraçõesvoid f(); evoid f(void); significa precisamente a mesma coisa, a funçãof não aceita nenhum parâmetro. Idem para definições.

Para C

Declaraçãovoid f(void); significa quef não aceita nenhum parâmetro.

Declaraçãovoid f(); significa que a funçãof pode ou não ter parâmetros, e se isso acontecer, não sabemos que tipo de parâmetros são esses, ou quantos deles existem. Note que não é o mesmo que reticências, não podemos usarva_list.

Agora aqui é onde as coisas ficam interessantes.

Caso 1

Declaração:

void f();

Definição:

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

Declaração:

void f();

Definição:

void f()
{
   //...
}
Questão:

O que acontece em tempo de compilação nos casos 1 e 2 quando ligamosf com os argumentos corretos, argumentos errados e nenhum argumento? O que acontece no tempo de execução?

Pergunta adicional:

Se eu declararf com argumentos, mas defini-lo sem eles, isso fará diferença? Devo ser capaz de abordar os argumentos do corpo da função?

questionAnswers(3)

yourAnswerToTheQuestion