Frage

Im ein wenig verwirrt. Was ist der Unterschied zwischen Vorwärtsdeklaration und Vorwärtsverweis? Forward-Deklaration ist, in meinem Kopf, wenn Sie eine Funktion deklarieren, die noch nicht umgesetzt isnt, aber das ist nicht richtig? Haben Sie bei der angegebenen Situation suchen entweder für einen Fall „Vorwärtsverweis“ oder „Forward-Deklaration“ zu erklären?

War es hilfreich?

Lösung

Wikipedia :

  

Forward-Deklaration

     

Deklaration einer Variablen oder Funktion, die noch nicht definiert sind. Ihre defnition kann später zu sehen.

     

Weiterleiten Referenz

     

ähnlich wie Forward-Deklaration aber, wo die Variable oder Funktion zunächst die Definition erscheint, ist auch vorhanden.

Andere Tipps

forward-Deklaration ist die Deklaration einer Methode oder Variable, bevor Sie sie implementieren und nutzen. Der Zweck der Vorwärtsdeklarationen ist die Kompilierung zu speichern.

Die Vorwärts Deklaration einer Variablen verursacht Speicherplatz aufgehoben werden, so dass Sie später den Wert dieser Variablen setzen kann.

Die Vorwärts-Deklaration einer Funktion wird auch als „Funktionsprototyp“ genannt und ist eine Erklärung Anweisung, die den Compiler, welche Rückgabetyp einer Funktion erzählt ist, was der Name der Funktion ist, und die Typen ihrer Parameter. Compiler in Sprachen wie C / C ++ und Pascal Laden erklärt Symbole in einer Lookup-Tabelle (die Funktionen umfassen) und Verweise sie, während sie über sie in Ihrem Code kommt. Diese Compiler lesen Sie den Code der Reihe nach, das heißt, von oben nach unten, also wenn Sie nicht vorwärts deklarieren, der Compiler entdeckt ein Symbol, das es nicht in der Lookup-Tabelle verweisen kann, und es löst einen Fehler, dass er nicht weiß, wie man die Funktion reagieren.

Die Forward-Deklaration ist ein Hinweis an den Compiler, die Sie (ausgefüllte die Umsetzung), um die Funktion an anderer Stelle definiert haben.

Zum Beispiel:

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

...

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

Aber Sie fragen, warum wir haben nicht nur der Compiler zwei Durchgänge auf jeder Quelldatei: das erste zu indizieren alle Symbole nach innen, und der zweite die Verweise zu analysieren und schauen sie auf? Laut Dan Story:

  

Wenn C im Jahr 1972 erstellt wurde, Computing-Ressourcen waren viel knapper   und bei einer hohen Prämie - der Speicher erforderlich, um einen Komplex zu speichern   Programm des gesamten auf einmal symbolisch Tisch war einfach nicht in   die meisten Systeme. Festspeicher war auch teuer und extrem langsam, so   Ideen wie die virtuellen Speicher oder Speicher von Teilen der symbolischen Tabelle auf   Scheibe einfach nicht Kompilierung in einem vernünftigen erlaubt haben   Zeitraum ... Wenn Sie mit Magnetband zu tun hat, wo mal suchen   wurden in Sekunden gemessen und gelesen wurde Durchsatz in Bytes gemessen pro   zweite (nicht Kilobyte oder Megabyte), das war ziemlich sinnvoll.

     

C ++, während später fast 17 Jahren entstanden, wurde als Obermenge definiert   von C, und hatte daher den gleichen Mechanismus zu verwenden.

     

Mit der Zeit Java gerollt um 1995 durchschnittlich Computer hatte genug   Erinnerung, dass ein symbolischen Tisch, auch für ein komplexes Projekt zu halten, war   nicht mehr eine erhebliche Belastung. Und Java wurde nicht entwickelt, um   rückwärtskompatibel mit C, so hatte es keine Notwendigkeit, ein Vermächtnis zu verabschieden   Mechanismus. C # war ähnlich unbelastet.

     

Als Ergebnis ihrer Designer wählten die Last zu verschieben   symbolische Erklärung wieder aus dem Programmierer Kompartimentierung und   legt sie auf dem Computer wieder, da die Kosten im Verhältnis zu dem   Gesamtaufwand der Kompilation war minimal.

In Java und C # sind Kennungen automatisch aus den Quelldateien erkannt und direkt von den dynamischen Bibliothek Symbolen lesen. In diesen Sprachen werden Header-Dateien nicht aus dem gleichen Grunde benötigt.

Vorwärts-Referenz ist das Gegenteil. Er bezieht sich auf die Verwendung eines Unternehmens vor seiner Erklärung. Zum Beispiel:

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);
}

Beachten Sie, dass „Vorwärts-Referenz“ manchmal, wenn auch weniger häufig verwendet wird, als Synonym für „forward-Deklaration.“

sind Vorwärtsdeklarationen verwendet Single-Pass-Zusammenstellung einer Sprache (C, Pascal) zu ermöglichen.

Wenn Vorwärtsreferenzen ohne Vorwärtsdeklaration erlaubt (Java, C #), ein Zwei-Pass-Compiler erforderlich ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top