namespace - problem... bin am Verzweifeln....
-
ok, hab da ein Problem mit Namespaces, und hab echt kA wo das Problem liegt.... folgendes:
in der Datei "globals.h" erstelle ich folgenden Namespace:
#ifndef GLOBALS_H #define GLOBALS_H #include <SDL.h> namespace blueGFIX { SDL_Surface* Display; int blubb; // nur zu Testzwecken } #endif
und in der main-Funktion will ich auf die Variable zugreifen:
int main(int argc, char *argv[]) { blueGFIX::Display = initiateVideo(800, 600, 16); // .... }
der GCC (3.2.2) meldet aber folgendes:
main.o(.bss+0x0): In function `main': /home/tom/coding/bluegfix/bluegfix/main.cpp:28: multiple definition of `blueGFIX::Display' drawing.o(.bss+0x0): first defined here main.o(.bss+0x4): In function `main': /home/tom/coding/bluegfix/bluegfix/main.cpp:28: multiple definition of `blueGFIX::blubb' drawing.o(.bss+0x4): first defined here collect2: ld returned 1 exit status gmake[2]: *** [bluegfix] Fehler 1
in drawing.o (das aus drawing.h und drawing.cpp besteht) wird aber nie auf den Namespace blueGFIX zugegriffen, lediglich globals.h wird ueber include eingebunden... aber der Namespace ist ja ueber Inclusion-Guards geschuetzt....
[ Dieser Beitrag wurde am 14.06.2003 um 18:23 Uhr von Blue-Tiger editiert. ]
-
Original erstellt von Blue-Tiger:
aber der Namespace ist ja ueber Inclusion-Guards geschuetzt....Eigentlich nicht. Dazu müßten die Include-Guards außerhalb des Namespaces stehen.
Und Du machst zweimal den gleichnamigen Namespace auf... das innere blueGFIX steht unterhalb des äußeren blueGFIX. Das wird wohl kaum beabsichtigt sein?
-
*g*... das war nur ein kleiner Fehler beim Copy&Paste'n vom Quelltext beim Posten, sry...
der eigentliche Fehler liegt woanders, leider
-
ich wuerde sagen du verletzt die ODR
-
hmm... gibts da irgend eine Loesung fuer? mir faellt leider ein...
Wie kann ich das machen, dass ich alle globalen Variablen in einem Namespace hab (wo sie IMO besser aufgehoben sind), und den Namespace in globals.h definier?
-
lies dir bitte Humes FAQ zu ODR durch!
da steht naemlich die loesung drinnen:
// OK. Durch das extern ist dies nur eine Deklaration.
extern int i;und in der global.cpp dann
int i;
siehe auch dein lieblings C++ zu 'extern'
-
thx a lot