En C99 debería dar un error de función no declarada error.
En C89/90 declarar funciones no es obligatorio. Si se invoca una función no declarada, el compilador asumirá que devuelve int
y le pasará argumentos después de someterlos a las llamadas promociones por argumento predeterminadas. En otras palabras, el compilador intentará deducir cuál es esa función de la llamada real. Si más tarde la función se define de forma diferente a la que dedujo el compilador, el comportamiento no está definido. Normalmente los compiladores se quejarán con una advertencia.
Esto es lo que observa en su caso. Cuando el compilador ve la llamada prn(e)
asume que prn
es la función int prn(int)
. Pero luego descubre que en realidad es void prn(double, int)
. La falta de coincidencia está causando la advertencia.
En este caso, tiene suerte en el sentido de que la llamada a la función no declarada se realiza en la misma unidad de traducción donde se define la función. Entonces el compilador tiene la oportunidad de comparar la llamada y la definición y emitir una advertencia sobre el conflicto. Si se definió prn
en alguna otra unidad de traducción, el compilador nunca tendría la oportunidad de comparar los dos, por lo que tendría un comportamiento indefinido completo en sus manos.