2012-03-28 5 views
0

Ich stieß auf einen Ratschlag in Stack-Überlauf, der erwähnt, wann zu verwenden und wann nicht, um Benutzeranmeldung weiterzugeben.Wie funktioniert der Compiler und Makefile kommt im Falle der Vorwärtsdeklaration zu spielen

ich auf diese kam: -

struct X;    // Forward declaration of X 

void f1(X* px) {}  // Legal: can always use a pointer/reference 
X f2(int);    // Legal: return value in function prototype 
void f3(X);   // Legal: parameter in function prototype 
void f4(X) {}   // ILLEGAL: *definitions* require complete types` 

Die letzte Zeile, die während Kompilierung fehl illegal erklärt.

void f3(X); // Works perfectly fine 

ist es so, dass alle Header-Dateien (.hh) werden zunächst durch Compiler gescannt und dann alle .cc Datei gesucht Syntax und symantics, wo wir tatsächlich die
void f3(X); als nach dem Scannen durch die Header-Dateien definieren Compiler wird die Idee haben über X seine Elementfunktion und Mitglied

+0

Wie hängt das mit Java zusammen? –

+0

Was ist die Frage? –

+0

@LuchianGrigore Die Frage ist mehr auf Forward-Deklaration und Compiler-Sache. Also dachte ich, dass das Konzept mehr oder weniger gleich wäre. Wenn Sie wollen, werde ich das Tag entfernen – Invictus

Antwort

5

Der Compiler scannt Headerdateien nicht. Alles was passiert, ist, dass der Präprozessor den Inhalt einer Header-Datei kopiert und einfügt, wenn eine #include auftritt, bevor diese Quelldatei an den Compiler übergeben wird.

So nach der Präprozessor ausgeführt wurde, dieses Beispiel:

foo.h

ABC 

bar.c

#include "foo.h" 
DEF 

einfach wird:

ABC 
DEF 

und das ist, was der Compiler selbst arbeitet.

2

Der Compiler scannt keine Header-Dateien. Vorwärtsdeklarationen funktionieren nur in Fällen, in denen der Compiler die vollständige Definition nicht sehen muss. Deshalb sind sie manchmal legal und manchmal illegal. Deshalb brauchen Sie sie auch von Anfang an.

+0

Danke für den Hinweis auf legale und illegale Teil. Kannst du den Begriff illegalen Teil in welchem ​​Sinn erklären? Liegt es daran, dass der Compiler nicht weiß, wie er implementiert wurde? – Invictus

+0

. Ist es illegal, weil wenn eine Forward-Deklaration gemacht wird, aber die Funktion nie aufgerufen wird, wird das Programm kompilieren und gut laufen. Wenn jedoch eine Forward-Deklaration vorgenommen wird, wird die Funktion aufgerufen, aber das Programm definiert die Funktion nie, das Programm kompiliert in Ordnung, aber der Linker wird sich beschweren, dass er den Funktionsaufruf nicht auflösen kann. – Invictus

+0

Eine Forward-Deklaration ist in dem Fall unzulässig, in dem der Compiler die vollständige Deklaration sehen muss, um zu wissen, welcher Code generiert werden soll. Sie sind legal, wenn der Compiler nur wissen muss, auf welchen Grundtyp sich der Name bezieht. –

Verwandte Themen