Las llamadas a función en C no requieren que un prototipo sea visible, pero se recomienda encarecidamente que esté dentro del alcance de un prototipo correcto.
La razón de esto es que si la definición de la función no coincide con los tipos de los argumentos de la función después de que se realizan las promociones del argumento de la función predeterminada, es muy probable que obtenga un comportamiento indefinido.
Tener visible el prototipo correcto significa que el compilador puede verificar los argumentos de una llamada de función y advertir al programador si hay una discrepancia.
C no permite que las funciones se sobrecarguen, por lo que solo puede tener un único prototipo para cualquier nombre de función.
Las promociones predeterminadas de los argumentos pueden causar desajustes inesperados.
E.g.
int main(int argc, char **argv)
{
short s = 5;
float f = 2.3f;
x(s, f); // x implicitly declared; default argument promotions performed
return 0;
}
int x(short t, float g) // Error: called with an int and a double
{
return (int)(t + g);
}
En la llamada a la función, porque no tiene x
prototipo visible (aún), s
será promovido a int
y f
será promovido a double
. Estas son promociones por argumento predeterminadas. Esto provoca una falta de coincidencia cuando la función se define con un prototipo que toma short
y float
aunque estos sean los tipos originales de los argumentos que se pasaron.
Funciones que toman una cantidad variable de argumentos (es decir, uso , ...
sintaxis) siempre debe tener un prototipo visible en el punto en el que se llaman.
Donde ha comentado no provocará un error de compilación. 'function_x();' declarará implícitamente 'function_x();' como una función sin prototipo que devuelve un 'int'. Sin embargo, es un error que la función se declare posteriormente como 'void'. –