PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem beim linken


Unregistered
2002-10-14, 17:52:53
Nachdem ich mich schon länger als unwürdiger kleiner Unreg hier im Forum rumtreibe hab ich auch mal eine Frage:

Ich habe einen Header, in dem ich ein paar Variablen deklariere und sobald ich den header in mehr als ein sourcefile #includiere, hab ich ungefähr so einen error:

main.obj : error LNK2005: "bool test" (?test@@3_NA) already defined in GLWindow.obj

(nein, ich hab das #ifndef-zeug nicht vergesen)

Also definiere ich die Variablen als extern, alles läuft. Damit eine externe Refernz funktioniert, muss die Variable aber noch irgendwo definiert werden.

Quote MSDN:
For an extern reference to be valid, the variable it refers to must be defined once

Also definiere ich in einem der sourcefiles in das ich #includiere, alles läuft. Sobald ich aber IM Header

test.h:
extern bool test;
bool test=false;

definiere -> Error

Kann vielleicht einer einem Anfänger wie mir erklären, wie das mit externen Referenzen und headern usw. funktioniert?


Thx im voraus!

P.S: Ich hoffe das ich mit dieser unwürdigen Frage Zecki, Demi und die anderen Gurus ;) hier nicht erschrecke, aber nicht vergessen Jungs:
Es gibt keine dummen Fragen, nur dumme Antworten.

Xmas
2002-10-14, 18:08:18
Generell sollte man möglichst selten globale Variablen verwenden. Wenn du eine Variable in mehreren Modulen verwenden willst, dann sollte die extern-Deklaration in einer Header-Datei stehen, die überall dort per #include eingebunden wird, wo diese Variable benötigt wird. Zusätzlich muss die Variable in einer .c/.cpp-Datei "richtig" deklariert werden, ohne extern.

Wenn du viele (projekt-)globale Variablen brauchst, dann macht es vielleicht auch Sinn eine "Globals.c"/"Globals.h" Kombination nur für diese zu verwenden.

Unregistered
2002-10-14, 18:50:21
Nochmal Thx@Xmas

Wieso reicht es nicht wenn ich meine Variablen "normal" deklariere, (ohne extern) und diesen Header dann überall dort #includiere wo ich die Variablen brauche?

Solange ich den entsprechenden header nur eine eine Datei einbinde funktioniert alles, sobald ich bei mehreren #includiere -> Error: already definded in xy
Wieso MUSS ich da extern deklarieren? Sollte das #ifndef nicht alle multiple Definitionen vermeiden?
??? ???

TK
2002-10-14, 19:33:25
#include macht ja nichts anderes als die entsprechende Datei an der Stelle des #include einzufügen. In deinem Falle hat das dann den gleichen Effekt als wenn du die Variable selber mehrfach deklarierst.

TK
2002-10-14, 19:37:45
Das #ifndef bezieht sich nur auf die jeweilige C/C++ - Datei. Es verhindert also, daß in einer C/C++ - Datei ein Header mehrfach eingebunden wird. Es kann aber nicht verhindern, daß in jeder neuen C/C++ - Datei, die den Header mit #include einbindet, die Variable wieder neu deklariert wird.

Xmas
2002-10-14, 21:14:47
Jop, so ist es. Beim Kompilieren wird für jedes Modul ein (vorläufiges) Datensegment angelegt, und für globale Variablen darin Speicherplatz reserviert. Der Code beinhaltet dann einen symbolischen Verweis auf diesen Speicherplatz. Würde man nun .obj-Dateien mit Variablen gleichen Namens zusammen linken, könnte der Linker ja nicht entscheiden welchen Speicherplatz er nun nehmen soll. Deswegen darf der Platz nur in einem Modul reserviert werden. Die anderen müssen externe Verweise beinhalten, so dass der Name zwar bekannt ist, aber kein Platz reserviert wird.

Unregistered
2002-10-15, 11:18:19
Jawoll, das wars was ich wissen wollte. Vielen Dank nochmal für die schnelle Erklärung (ich habs sogar verstanden :D)

Dies Forum gefällt mir, ich glaub hier bleib ich...:D

Nasenbaer
2002-10-15, 14:08:02
Aha, das ich ja interessant. Ich hab den #ifndef auch immer so verstanden wie Unreg. Ihr habt mir sehr geholfen. =)

Mfg Nasenbaer

Nasenbaer
2002-11-21, 21:43:43
Klappt irgendwie nicht so ganz :-/


// global.h

extern Fullscreen;



//main.cpp

#include "global.h"

bool Fullscreen = true;


bekomme dann den Fehler in der global.h, dass es bei ANSI C++ nicht gestattet ist Variablen ohne Typen zu deklarieren.
Vorschläge ?


Mfg Nasenbaer

zeckensack
2002-11-22, 02:51:19
Originally posted by Nasenbaer
Klappt irgendwie nicht so ganz :-/


// global.h

extern Fullscreen;



//main.cpp

#include "global.h"

bool Fullscreen = true;


bekomme dann den Fehler in der global.h, dass es bei ANSI C++ nicht gestattet ist Variablen ohne Typen zu deklarieren.
Vorschläge ?


Mfg Nasenbaer Folge der Fehlermeldung und definiere den Typ der Variable.

//global.h

extern bool Fullscreen;
Btw, einfacher ist's (zumindest wenn man mal mehr als drei, vier CPPs zusammenlinkt) wenn man die globalen Variablen in ihr eigenes Modul packt. XMas hat's schon angedeutet.

Also//global.cpp


//dieses Include ist nicht unbedingt nötig, dadurch kann uns der Compiler aber
//rechtzeitig warnen, wenn die Deklarationen nicht zu den Definitionen passen
#include "global.h"

bool Fullscreen;

//das war's, hier keine Funktionen rein sondern nur Variablendefinitionen

Hat den Vorteil daß man in großen unübersichtlichen Projekten immer sofort weiß wo die globalen Variablen definiert sind, und nicht erst suchen muß (passiert mir ständig ...).