estaba leyendo Wikipedia sobre las declaraciones de C/C++ Prototype y estoy confundido:Propósito de C/C Prototipos ++
Wikipedia dice: "Al incluir el prototipo de función, se informa al compilador que la función 'fac' toma un argumento entero y habilita al compilador para detectar este tipo de errores ".
y utiliza el siguiente ejemplo:
#include <stdio.h>
/*
* If this prototype is provided, the compiler will catch the error
* in main(). If it is omitted, then the error will go unnoticed.
*/
int fac(int n); /* Prototype */
int main(void) { /* Calling function */
printf("%d\n", fac()); /* ERROR: fac is missing an argument! */
return 0;
}
int fac(int n) { /* Called function */
if (n == 0)
return 1;
else
return n * fac(n - 1);
}
embargo, la definición de la función de la función de llamada ya incluye todos los la información que el prototipo le dice al compilador, así que por qué no se puede deducir que el compilador esta información de la definición de la función llamada ya que contienen idénticas declaraciones/carta de información para la carta?
¿Qué me estoy perdiendo? Parece un trabajo extra sin ganancia obvia.
Edit: Gracias chicos. Supuse que los compiladores eran multi-pass, supongo. Estoy mimado con los idiomas actuales, como Python. Tiene sentido ya que es tan viejo que necesita algunos kludges para hacer las cosas con precisión en una sola pasada. Me parece más obvio ahora. Aparentemente, requiere un conocimiento bastante íntimo de cómo el compilador vincula y compila.
Tenga en cuenta que este artículo de wikipedia contiene cosas incorrectas. Puedes ver en la página de discusión cómo algunos chicos simplemente no permiten que se corrija. Me di por vencido en eso. –
Es por eso que defino funciones antes de que se llamen (en el mismo archivo fuente, de todos modos). Elimina la necesidad de una declaración por separado, aunque significa que mi código dice "al revés". –