4 Stimmen

Warum ist ein Prototyp erforderlich, auch ohne Klassendeklaration?

Wenn ich es einfach mache: Beispiel 1:

#include 

int main()
{
    //Versuche die Funktion doSomething aufzurufen
    doSomething();
}

void doSomething()
{
    std::cout << "Rufe mich jetzt an!" << std::endl;
}

Ich bekomme einen Kompilierungsfehler! Weil der Compiler nicht weiß, was "doSomething" ist.

Aber wenn ich die Position von doSomething ändere, sodass sie an erster Stelle steht, kompiliert das Programm erfolgreich. Beispiel 2:

#include 

void doSomething()
{
    std::cout << "Rufe mich jetzt an!" << std::endl;
}

int main()
{
    //Versuche die Funktion doSomething aufzurufen
    doSomething();
}

Ich kann den Prototyp so deklarieren: Beispiel 3:

#include 

void doSomething(void);

int main()
{
    //Versuche die Funktion doSomething aufzurufen
    doSomething();
}

void doSomething()
{
    std::cout << "Rufe mich jetzt an!" << std::endl;
}

Aber warum funktioniert das erste Beispiel nicht? Warum muss ich überhaupt einen Prototyp deklarieren oder Funktionen vor der main-Funktion aufrufen?

Danke!

7voto

Ernest Friedman-Hill Punkte 79357

Sie können keine Funktion aufrufen, ohne dass der Compiler zuvor entweder die Definition oder eine Deklaration gesehen hat - ganz einfach. Ein Prototyp oder die tatsächliche Definition muss vor einem Aufruf erscheinen.

1voto

Mordachai Punkte 9015

Weil der Compiler doSomething noch nicht gesehen hat, bevor es verwendet wird.

Entweder muss man es prototypisieren oder zuerst definieren, damit der Compiler weiß, wie er die Verwendung davon analysieren soll.

1voto

IronMensan Punkte 6590

Dies ist ein Erbe von C. C ist eine Einzelpasssprache, was bedeutet, dass alles nur beim einmaligen Lesen der Datei geschehen muss. Um eine Funktion ohne Vorwärtsdeklaration/Prototyp aufrufen zu können, müsste die Datei zweimal gelesen werden; das erste Mal, um alle Funktionssignaturen zu finden, und das zweite Mal, um tatsächlich zu kompilieren.

C++ hat diese Anforderung für Features, die Teil von C waren, wie freie Funktionen und globale Variablen, beibehalten. Klassen sind jedoch neu in C++ und es bestand kein Bedarf, die alte Herangehensweise beizubehalten. Daher wird innerhalb einer einzelnen Klassendefinition eine Mehrpasskompilierung verwendet. Deshalb kann man das machen:

class MyClass {
    void foo() {bar();}
    void bar() {}
};

Aber das, was du in deiner Frage aufgelistet hast, geht nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X