¿qué diferencia hay en hacer las funciones con prototipo y sin prototipo?
Las ventajas del uso de prototipos superan con mucho a las desventajas que no hay razón (de peso) para no utilizarlos.Aun así si se quiere desarrollar un programa sin prototipos es posible siempre y cuando se cumpla con varios requerimientos: para empezar toda función debe definirse antes de cualquier uso de esta.
Si eso no es posible (por ejemplo en el caso de dos funciones donde una llame a la otra) todavía hay la posibilidad de terminar con un programa funcional pero se deben cubrir dos requisitos: 1) El numero y tipo de parámetros de la función debe coincidir con la llamada (no es posible con funciones con un numero variable de argumentos como printf) y 2) El valor de retorno de la función debe ser de tipo int. Si no se cumplen ambos ya no hay garantías sobre el resultado del programa (comportamiento no definido o UB).
Lo anterior es la razón por la que, de vez en cuando, algunos usuarios comentan que pueden utilizar una función de la biblioteca estándar de C sin incluir el encabezado correspondiente. Un caso común es system:
Código
Como ahí la llamada coincide con la declaración no hay problema.
#include <stdio.h> int main(void) { return 0; }
Pero en otros casos no es así, por ejemplo con atof:
Código
Ya que el valor de retorno se asume como int cuando en realidad es double ello resulta en UB (puede funcionar correctamente o no, en mi caso no lo hace e imprime como salida 0.00).
#include <stdio.h> int main(void) { return 0; }
En resumen mejor utilizar prototipos y te olvidas de los dolores de cabeza.
Un saludo