Considera il seguente codice "C":
#include<stdio.h>
main()
{
printf("func:%d",Func_i());
}
Func_i()
{
int i=3;
return i;
}
Func_i()
è definito alla fine del codice sorgente e non viene fornita alcuna dichiarazione prima del suo utilizzo in main()
. Nel momento in cui il compilatore vede Func_i()
dentro main()
, esce da main()
e lo scopre Func_i()
. Il compilatore in qualche modo trova il valore restituito Func_i()
e lo fornisce printf()
. So anche che il compilatore non riesce a trovare il tipo di ritorno di Func_i()
. Di default prende (indovina?) Il tipo di ritorno di Func_i()
essere int
. Cioè se il codice avesse float Func_i()
quindi il compilatore darebbe l'errore: tipi in conflitto perFunc_i()
.
Dalla discussione sopra vediamo che:
Il compilatore può trovare il valore restituito da
Func_i()
.- Se il compilatore riesce a trovare il valore restituito
Func_i()
uscendo damain()
e cercando nel codice sorgente, perché non riesce a trovare il tipo di Func_i (), che è esplicitamente menzionato.
- Se il compilatore riesce a trovare il valore restituito
Il compilatore deve sapere che
Func_i()
è di tipo float - ecco perché dà l'errore di tipi in conflitto.
- Se il compilatore sa che
Func_i
è di tipo float, allora perché assume ancoraFunc_i()
di essere di tipo int e dà l'errore di tipi in conflitto? Perché non forzatamente rendereFunc_i()
di tipo float.
Ho lo stesso dubbio con la dichiarazione variabile . Considera il seguente codice "C":
#include<stdio.h>
main()
{
/* [extern int Data_i;]--omitted the declaration */
printf("func:%d and Var:%d",Func_i(),Data_i);
}
Func_i()
{
int i=3;
return i;
}
int Data_i=4;
Il compilatore restituisce l'errore: "Data_i" non dichiarato (primo utilizzo in questa funzione).
- Quando il compilatore vede
Func_i()
, scende al codice sorgente per trovare il valore restituito da Func_ (). Perché il compilatore non può fare lo stesso per la variabile Data_i?
Modificare:
Non conosco i dettagli del funzionamento interno di compilatore, assemblatore, processore ecc. L'idea di base della mia domanda è che se dico (scrivo) il valore di ritorno della funzione nel codice sorgente finalmente, dopo l'uso di quella funzione quindi il linguaggio "C" consente al computer di trovare quel valore senza dare alcun errore. Ora perché il computer non riesce a trovare il tipo in modo simile. Perché non è stato possibile trovare il tipo di Data_i poiché è stato trovato il valore restituito di Func_i (). Anche se uso l' extern data-type identifier;
istruzione, non sto dicendo il valore che deve essere restituito da quell'identificatore (funzione / variabile). Se il computer riesce a trovare quel valore, perché non riesce a trovare il tipo. Perché abbiamo bisogno della dichiarazione anticipata?
Grazie.
Func_i
non valido. Non c'è mai stata una regola per dichiarare implicitamente variabili indefinite, quindi il secondo frammento era sempre malformato. (Sì, i compilatori accettano ancora il primo campione perché era valido, se sciatto, sotto C89 / C90.)