Cita de: DanielC# en 6 Enero 2015, 18:31 PM¿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 (c) [Seleccionar]
#include <stdio.h>
int main(void)
{
puts("Hola, mundo");
system("pause");
return 0;
}
Como ahí la llamada coincide con la declaración no hay problema.
Pero en otros casos no es así, por ejemplo con atof:
Código (c) [Seleccionar]
#include <stdio.h>
int main(void)
{
double d = atof("3.0");
printf("%.2f\n", d);
return 0;
}
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).
En resumen mejor utilizar prototipos y te olvidas de los dolores de cabeza.
Un saludo