Warum muss die Funktion main() am Ende stehen?


berechnen(int x, int y)
{
int z = x + y;
return z;
}

int main()
{
int a = 5;
int b = 3;
int c;
c = berechnen(a, b);
std::cout << c;
return 0;
}```

Kann mir jemand kurz erläutern, warum das Programm nur läuft, wenn die Funktion berechnen() im Quelltext vor der Funktion main() steht?

Ich komme aus der Java-Programmierung, da gibt es so etwas nicht. In Java ist es egal, an welcher Stelle in einer Kasse eine Methode steht.

Im Moment kann ich es dir nur so erklären, dass ich annehme, dass in C++ zuerst die Methode deklariert/definiert/implementiert sein muss, bevor man sie aufrufen/verwenden kann.
Anderenfalls ist sie wohl für den Compiler (noch) nicht existent.

Ich hoffe, die Antwort ist halbwegs befriedigend.

Der Compiler in C/C++ analysiert eine Datei nur einmal. Das bedeutet er liest die Datei von oben nach unten. Wenn main als erstes steht, sieht der compiler einen Funktionsaufruf einer für ihn unbekannten Funktion berechnen und weiß gar nicht, dass die Funktion später noch kommt.

Wenn du die Reihenfolge so nicht vorgeben möchtest, kannst du zuvor die methode/funktion zuvor in einer header-datei deklarieren.

Mit dem Deklarieren sagst du dem Compiler dass es eine Funktion geben wird und die Implementierung später noch kommt.

Edit:
Java verwendet eine Multipass compiler, das bedeutet, dass er jede Datei zumindest zweimal durchläuft und daher wenn er eine Funktion (gilt auch für Variablen,Konstanten usw.) noch nicht kennt trotzdem fortfahren kann weil er vl die Aufloesung dann im nächsten Durchlauf machen kann.

Ja, das ist richtig. Es kommt auf den Scope-Anfang der Funktionen an…

Hier noch ein Link der das erklärt.

What’s the difference between declaring and defining in C and C++ - Cprogramming.com

Der Unterschied zwischen Deklaration und Definition wird ja schon im Link oben erklärt. Aber nochmal kurz:

  • Deklaration ist nur die Aussage: “Diese Funktion gibt es (irgendwo)”
  • Definition bedeutet: “DAS hier IST die Funktion - und ihr Code”

Man könnte es auch so machen:


#include <iostream>
     
int berechnen(int x, int y); /* Deklaration */
     
int main()
{
    int a = 5;
    int b = 3;
    int c;
    c = berechnen(a, b); /* Hier ist bekannt, dass es diese Funktion (irgendwo) gibt */
    std::cout << c;
    return 0;
}

/* Definition */
int berechnen(int x, int y)
{
    int z = x + y;
    return z;
}

Normalerweise stehen die Deklarationen in Header-Dateien (.h), und die Definitionen in den Implementierungen (.c) (und bei C++ ist das noch ein bißchen komplexer).