¿Por qué se compila una función sin parámetros (en comparación con la definición de la función real)?

Acabo de encontrar el código C de alguien que me confunde por qué se está compilando. Hay dos puntos que no entiendo.

Primero, la función prototipo no tiene parámetros en comparación con la definición real de la función. Segundo, el parámetro en la definición de la función no tiene un tipo.

#include <stdio.h>

int func();

int func(param)
{
    return param;
}

int main()
{
    int bla = func(10);    
    printf("%d", bla);
}

¿Por qué funciona esto? Lo he probado en un par de compiladores, y funciona bien.

Respuestas a la pregunta(10)

Su respuesta a la pregunta