Domanda

Sono un po' confuso.Qual è la differenza tra dichiarazione anticipata e riferimento anticipato?La dichiarazione anticipata è, nella mia testa, quando dichiari una funzione che non è ancora implementata, ma non è corretta?È necessario considerare la situazione specificata per dichiarare un caso "riferimento anticipato" o "dichiarazione anticipata"?

È stato utile?

Soluzione

Da Wikipedia:

Dichiarazione anticipata

Dichiarazione di una variabile o funzione non ancora definita.La loro definizione potrà essere vista più avanti.

Riferimento in avanti

Simile alla dichiarazione anticipata ma dove la variabile o la funzione appare per prima, anche la definizione è presente.

Altri suggerimenti

UN dichiarazione anticipata è la dichiarazione di un metodo o di una variabile prima di implementarlo e utilizzarlo.Lo scopo delle dichiarazioni anticipate è quello di risparmiare tempo di compilazione.

La dichiarazione anticipata di una variabile fa sì che lo spazio di archiviazione venga messo da parte, in modo da poter impostare successivamente il valore di quella variabile.

La dichiarazione anticipata di una funzione è anche chiamata "prototipo di funzione" ed è un'istruzione di dichiarazione che indica al compilatore qual è il tipo restituito di una funzione, qual è il nome della funzione e i tipi dei suoi parametri.I compilatori in linguaggi come C/C++ e Pascal memorizzano i simboli dichiarati (che includono funzioni) in una tabella di ricerca e vi fanno riferimento non appena li incontrano nel codice.Questi compilatori leggono il tuo codice in sequenza, cioè dall'alto verso il basso, quindi se non inoltri la dichiarazione, il compilatore scopre un simbolo a cui non può fare riferimento nella tabella di ricerca e genera un errore che non conosce come rispondere alla funzione.

La dichiarazione anticipata è un suggerimento per il compilatore che hai definito (compilato l'implementazione) della funzione altrove.

Per esempio:

int first(int x); // forward declaration of first

...

int first(int x) {
   if (x == 0) return 1;
   else return 2;
}

Ma, chiedi, perché non facciamo semplicemente fare due passaggi al compilatore su ogni file sorgente:il primo per indicizzare tutti i simboli all'interno e il secondo per analizzare i riferimenti e cercarli?Secondo Dan Story:

Quando C è stato creato nel 1972, le risorse di calcolo erano molto più scarse e ad un alto premio, la memoria necessaria per memorizzare un complesso l'intera tabella simbolica del programma in una sola volta semplicemente non era disponibile in la maggior parte dei sistemi.Anche l'archiviazione fissa era costosa ed estremamente lenta, quindi idee come la memoria virtuale o l'archiviazione di parti della tabella simbolica su semplicemente non avrebbe permesso la compilazione in un modo ragionevole Lasso di tempo...Quando si ha a che fare con il nastro magnetico dove i tempi di ricerca sono stati misurati in secondi e la velocità effettiva di lettura è stata misurata in byte per in secondo luogo (non kilobyte o megabyte), che era piuttosto significativo.

C++, sebbene sia stato creato quasi 17 anni dopo, è stato definito come un superset di C, e quindi ha dovuto utilizzare lo stesso meccanismo.

Quando Java è arrivato nel 1995, i computer medi ne avevano abbastanza memoria che reggere un tavolo simbolico, anche per un progetto complesso, era non è più un onere sostanziale.E Java non è stato progettato per essere retrocompatibile con il C, quindi non aveva bisogno di adottare un meccanismo.C# era altrettanto libero.

Di conseguenza, i loro progettisti hanno scelto di spostare l'onere di compartimentando la dichiarazione simbolica indietro dal programmatore e rimetterlo sul computer, poiché il suo costo è proporzionale al Lo sforzo totale di compilazione è stato minimo.

In Java e C#, gli identificatori vengono riconosciuti automaticamente dai file sorgente e letti direttamente dai simboli della libreria dinamica.In questi linguaggi i file header non sono necessari per lo stesso motivo.

UN riferimento anticipato è il contrario.Si riferisce all'uso di un'entità prima della sua dichiarazione.Per esempio:

int first(int x) {
   if (x == 0) return 1;
   return second(x-1); // forward reference to second
}

int second(int x) {
   if (x == 0) return 0;
   return first(x-1);
}

Si noti che "riferimento futuro" viene utilizzato talvolta, anche se meno spesso, come sinonimo di "dichiarazione futura".

dichiarazioni a termine sono utilizzati per consentire a singolo passaggio compilazione di un linguaggio (C, Pascal).

se i riferimenti a termine sono ammessi senza dichiarazione in avanti (Java, C #), è necessario un compilatore a due passaggi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top