Multiple definition trotz include guards
-
Hi,
ich bekomme vom Compiler die Fehlermeldung
multiple definition of `NUM_OF_VOWLS'
wobei NUM_OF_VOWLS eine Konstante ist, die in der Headerdatei "WordLib.h" deklariert wird.
Die Deklaration dieser Konstante befindet sich aber innerhalb vom Inlude-Guards
#ifndef WORDLIB_H_ #define WORDLIB_H_ ... #endif
Der Aufruf WordLib.h zu inkludieren erfolgt genau zweimal: Einmal in Main.c und einmal in WordLib.c.
Ich verstehe gar nicht, wie die Fehlermeldung trotz Inlude-Guards möglich ist...Hat jemand eine Idee?
-
Dem Fehler zufolge müsstest du NUM_OF_VOWLS in der Header nicht nur deklariert sondern auch definiert haben. Das geht natürlich durch den Compiler, der immer nur Datei für Datei anschaut. Aber der Linker merkt dann, das du im Prinzip mehrere globale Variablen mit dem gleichen Namen hast.
-
Stimmt, ich hab die Konstante auch definiert. Aber wieso ist das ein Problem?
Beim ersten inkludieren des Headers mit der Definition wird die Definition der Konstante durchgeführt, bei weiteren Versuchen, den Header zu inkludieren, wird dies von den Guards verhindert. Ergo habe definiere ich die globale Konstante max. einmal !?
-
Einmal pro Übersetzungseinheit. Also einmal für WordLib.c und einmal für Main.c. Das mag der Linker nicht, da beide das gleiche Symbol definieren.
Mach es so wie man es macht: Definition in WordLib.c, extern Deklaration in WordLib.h.
-
Ah, das ist jetzt schonmal wesentlich besser.
Allerdings warnt mich der Compiler:
`NUM_OF_VOWLS' initialized and declared `extern'
Wenn ich die Konstante static mache, warnt er mich nicht mehr. Ist extern so doch nicht comme il faut?
-
Du darfst nicht die extern Deklaration (im Header) initialisieren, sondern die Definition (in der .c).