"multiple definition"

DeChecka

Erfahrenes Mitglied
Hi!
Wieder mal ein Problem...

---------------------------------------------------------[Dev-C++]---------------------------------------------------------

Habe nur mal ein bisschen rumprobiert, bestimmte Variablen (zum Beispiel int X) in einer eigenen Header zu deklarieren.
Ging dann nicht, es kam die Meldung
multiple definition of X
first defined here
ld returned 1 exit status

Dann hab ich das ganze rückgängig gemacht, also wieder die Variablen nur in der XY.cpp deklariert, aber jetzt kommt diese Meldung immer noch...
Das Kuriose: Vor den Probierereien lief alles noch mit exakt demselben Quellcode :confused: ...

Was bedeutet denn diese Fehlermeldung?

MfG
DeChecka
 
Also erstmal gibt es einen gewaltigen Unterschied zwischen Deklaration und Definition.

Was du offensichtlich getan hast ist eine Variable mehrfach zu definieren, was nicht erlaubt ist. Also prinzipiell soetwas:
Code:
int x;
int x;
In einer Header Datei solltest du normalerweise keine Variablen definieren, sondern nur deklarieren. Das geht in C/C++ mit dem Schlüsselwort "extern". Also, in der Header Datei
Code:
extern int x;
und dann in einer(!) C/C++ Datei definieren
Code:
int x;
; in allen anderen C/C++ Dateien brauchst du die Header Datei nur noch einbinden und kannst die Variable x benutzen.

Eine wichtige Sache ist auch noch die Header Dateien immer schön gegen Mehrfacheinbinden zu schützen. Eine Header Datei namens xyz.h sollte grundlegend so aussehen
Code:
#ifndef XYZ_H
#define XYZ_H

/* hier kommen jetzt die Deklarationen / Prototypen */

#else /* XYZ_H */

/* hier stehen forward Deklarationen wenn nötig. */

#endif /* XYZ_H */
Wenn jetzt obwohl du alles rückgängig gemacht hast es trotzdem nicht funktioniert, dann liegt das daran das die Objekt Dateien nicht neu kompiliert worden sind. In Dev-C++ müßte irgendwo ein Befehl sein mit dem du alles nochmal kompilieren kannst ("Rebuild All", bzw. Strg-F11 drücken).
 
Also erstmal vielen Dank Das mit dem Befehl "Alles erneuern" hat wunderbar funktioniert! ;)

Zu den Definitionen: Die hab ich natürlich nur im C++-Source-Code gemacht, nicht in der Header...
In der Header hab ich nur deklariert, allerdings ohne das Schlüsselwort "extern".
Definiert und deklariert zumindest nach meinen Begriffen... Kannst du mir bitte nochmal genau klarmachen, was der Unterschied zwischen Definition und Deklaration ist? :confused:
Das check ich nämlich grad net :) ...

Jo, und das letzte mit dem #ifndef, #define, etc., das verstehe ich leider noch net so genau, wieso das notwendig ist... Hab das bisher nämlich noch net so gemacht.
Vielleicht kannste das kurz erklären oder mir 'nen guten Link geben, wo's speziell darum geht? ;)

MfG
DeChecka
 
Also, Deklarieren bedeutet einfach "vereinbaren". Im Grunde vereinbarst du bei einer Deklaration einen Typ für eine Variable so dass der Compiler bestimmte Annahmen treffen kann was für Operationen (Addition, Subtraktion usw.) man mit der Variable machen kann.

Wenn man Variablen ohne das Schlüsselwort "extern" deklariert, ist das auch gleichzeitig eine Definition der Variablen, das heißt es wird Speicher für die Variable vom Compiler bereitgestellt und evtl. Code generiert um die Variable zu initialisieren/instanzieren.

Für eine Funktion reicht es andererseits den sogenannten Prototyp anzugeben um sie zu Deklarieren:
Code:
int funktion(int, char*);
Hiermit wird eine Funktion vereinbart und die wichtigsten Informationen dem Compiler mitgeteilt (Rückgabetyp, Name der Funktion, Anzahl und Typ der Parameter). Das reicht erstmal aus, man muss die Funktion dann aber auch irgendwo definieren:
Code:
int funktion(int x, char* wort) { return (int) wort[x]; }

Zu den Präprozessordirektiven (#ifndef usw.) kannste was hier nachlesen.

Im Grunde geht's nur darum ein wiederholtes Einbinden ein und derselben Header Datei zu ermöglichen (Beispiel: a1.c includes a1.h, a1.h includes b2.h, b2.h includes c2.h und c2.h includes a1.h) ohne das Fehler auftauchen oder ein unendliches Einbinden entsteht. Vertrau mir einfach. :)

Manchmal gibt es auch die Situtation wo man 2 Header Dateien hat, die sich gegenseitig einbinden. Spätestens da hat man ohne diesen Schutzmechanismus ein Problem.
 
Zurück