C++ Compiler Frage

joedelord

Aktives Mitglied
Thread Starter
Dabei seit
12.12.2002
Beiträge
492
Reaktionspunkte
0
hallo macuser,
wiedermal brauch ich eure hilfe (wahrscheinlich nicht das letzte mal). diesmal geht es wieder um den compiler;
um mein problem zu testen habe ich ein kleines testprojekt angelegt und folgendes ausprobiert:

Code:
#include <iostream>
using namespace std;

int funktion()
{
    return funktion2(5);
}

int funktion2(int inputZahl)
{
    return inputZahl * inputZahl;
}

int main (int argc, const char * argv[])
{
    int a;
    a = funktion();
    cout << "a = "<< a <<"\n";
    cout << "Hello, World!\n";
    return 0;
}
die eine funktion ruft eine andere auf, nichts aufregendes, bis auf die tatsache das ich immer eine compiler fehlermeldung bekomme:

main.cpp: In function `int funktion()':
main.cpp:6: `funktion2' undeclared (first use this function)
main.cpp:6: (Each undeclared identifier is reported only once for each function it appears in.)
main.cpp: In function `int funktion2(int)':
main.cpp:10: `int funktion2(int)' used prior to declaration

sobald ich aber die funktionen vertausche und vorher funktion2 definiere, wird alles korrekt compiliert.
Code:
#include <iostream>
using namespace std;

int funktion2(int inputZahl)
{
    return inputZahl * inputZahl;
}

int funktion()
{
    return funktion2(5);
}

int main (int argc, const char * argv[])
{
    int a;
    a = funktion();
    cout << "a = "<< a <<"\n";
    cout << "Hello, World!\n";
    return 0;
}

warum kommt es ueberhaupt zu diesem fehler? nur dadurch das ich eine funktion deklariere wird sie ja nicht ausgefuert oder? musss ich immer wen ich klassen oder funktionen deklariere darauf achten wo genau sie im code stehen damit sie der compiler nicht rauswirft?

danke im vorraus, joedelord
 
joedelord schrieb:
warum kommt es ueberhaupt zu diesem fehler? nur dadurch das ich eine funktion deklariere wird sie ja nicht ausgefuert oder?
Nein, ausgeführt wird die durch die Deklaration nicht allerdings und der "Fehler" (eigentlich ist es keiner) Tritt auf, weil Du eben die Funktion nicht deklariert sondern nur implementiert hast.
Man kann die Deklaration weglassen, deswegen ist es kein Fehler, aber dann muss man eben drauf achten, daß eine Funktion im Quelltext vor dem Aufruf steht.

Wenn Du hinter die includes folgendes schreibst:
Code:
int funktion();
int funktion2(int inputZahl);
Kannst Du die Funktionen im Code an jeder beliebigen Stelle positionieren.

joedelord schrieb:
musss ich immer wen ich klassen oder funktionen deklariere darauf achten wo genau sie im code stehen damit sie der compiler nicht rauswirft?
Wenn Du deklarierst stellt sich dieses Problem nicht und da Klassen immer deklariert werden müssen; kein Problem. Lediglich Funktionen müssen nicht deklariert werden sobald Du aber mit mehreren Units arbeitest kommst Du eh nicht um Header Files rum in denen eben dann die Deklaration steht wo hingegen das zugehörige c++ file die Implementierung enthält.

Bis neulich ...
 
vielen dank fuer die hilfe, schoen langsam blicke ich ein bischen durch c++ durch. jetzt weis ich endlich genau was diese fehlermeldung bedeutet.

danke, joedelord

edit: verhaelt sich das mit methoden gleich? kann es bei dabei auch zu diesem fehler kommen?
 
In C++ ist es eigentlich auch üblich, das Interface der zu implementierenden Klasse in einer Header-Datei (*.h) anzugeben und diese in die Implementations-Datei (*.cpp) zu includen. Dann hast du dieses Problem nicht mehr.
 
danke fuer die hilfe, das erleichtert mir meine arbiet.

lg, joedelord
 
Methoden sind Funktionen ;-)

In C war es üblich die Funktionsprototypen oberhalb der Main_Funtion zu sammeln und Die Funktionen an sich unterhalb der main() zu implementieren. Sieht man noch relativ häufig in älteren Quelltexten.

Wie schon erwähnt packt man in grösseren Projekten die Funktionen in .c Dateien und die Zugehörigen Prototypen in .h (Header) Dateien. Das alles wird dann richtig interessant wenn man mit shared Libraries arbeitet. Dort liegen die Funktionen in einer kompilierten (binären) .so, .a oder .dylib Datei. Die Funktionen werden dann über die zugehörigen .h Files angesprochen.

BadHorsie
 
Zuletzt bearbeitet:
Zurück
Oben Unten