stavo leggendo wikipedia sul C/dichiarazioni di C++ per prototipi e io sono confuso:Scopo del C/C++ Prototipi
Wikipedia dice: "Con l'inclusione del prototipo di funzione, si informa il compilatore che la funzione 'fac' prende un argomento intero e si abilita il compilatore a catturare questi tipi di errori. "
e utilizza il sotto come esempio:
#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);
}
Ma la definizione della funzione della funzione chiamata include già tutte le informazioni che il prototipo dice al compilatore, quindi perché non può il compilatore dedurre questo informazioni dalla definizione della funzione chiamata poiché contengono identiche dichiarazioni/informazioni lettera per lettera?
Cosa mi manca? Sembra un lavoro extra senza guadagni ovvi.
Modifica: Grazie ragazzi. Immaginavo che i compilatori fossero multi-pass. Sono viziato in linguaggi correnti come Python. Ha senso dal momento che è così vecchio da aver bisogno di alcuni kludges per fare le cose con precisione in un unico passaggio. Mi sembra più ovvio ora. Apparentemente richiede una conoscenza abbastanza intima di come il compilatore collega e compila.
Si noti che questo articolo di wikipedia contiene cose sbagliate. Puoi vedere nella pagina di discussione come alcuni ragazzi non si lasceranno correggere. Ho rinunciato a questo. –
Ecco perché definisco le funzioni prima che vengano chiamate (nello stesso file sorgente, comunque). Elimina la necessità della dichiarazione separata, anche se significa che il mio codice legge "all'indietro". –