C++ Konsolenprogramm, Probleme beim Binden & Compilieren
-
Dieser Thread wurde von Moderator/in kingruedi aus dem Forum Linux/Unix in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
DrGreenthumb schrieb:
template-klassen lassen sich nicht wie üblich in .h und .cpp aufteilen.
Da muss die ganze implementierung der klasse in die header-dateiUnd ich dachte immer, dass ist nur beim VC++ so
-
Es funktioniert, wenn ich die ganze Implementation in "memory_class.h" stecke und eine leere "memory_class.cpp" erzeuge die nur den Header einbindet.
Eine frage hab ich noch:
Warum beschwert er sich beim Linken, dass die Konstanten aus "memory_constants.h" mehrfach definiert seien, wenn ich doch die Präprozessor Wächter eingebaut habe?Bis später...
-
du könntest die template definition in eine separate datei mit einer anderen endung, z.b. .tpl speichern und dann am Ende des headers includieren. so hast du immer noch deklaration und definition deutlich getrennt. nachteil ist, dass du evtl. für .tpl dateien kein syntax highlighting von deinem editor bekommst.
übrigens solltest du das using namespace std; in headern (und logischerweise auch template definitionsfiles...) unterlassen.
warnungen bekomme ich im übrigen hier keine.
-
ich hatte die betreffenden includes auskommentiert, deswegen kommt die meldung nicht (ich wusste ja dass ich sie nicht zweimal brauchte)
Normalerweise müsste in "memory_class.cpp" und in meinen main Teil die "memory_const.h" eingebunden werden, da beide Konstanten aus diesem Header brauchen.
Inzwischen brauche ich diesen Konstanten Header zwar nicht mehr, da ich das ganze Programm eh auf eine dynamische Spielfelderzeugung umgestellt habe, aber mich würde schon interessieren warum das trotz #ifndef Wächter nicht funktioniert hat.Ohh, wie ich gerade sehe kann ich dieses Verhalten nichtmal reproduzieren.
Ich glaube das Problem hat sich gerade in Luft aufgelöst...
wenn das nur öfter vorkommen würdeDanke nochmal!
-
simon.phoenix schrieb:
Und ich dachte immer, dass ist nur beim VC++ so
Nein, das ist bei allen Compilern so, die kein export unterstützen. Und das kann afaik nur der Comeau.
-
Vermutlich hast du die Konstanten nicht static gemacht. Include guards bringen dafür nichts, weil ja der Compiler (und somit der Präprozessor) zweimal unabhängig voneinander aufgerufen wird.
-
Das versteh ich jetzt intuitiv nicht so ganz. Wenn ich doch include Guards setzte wird der Text doch gar nicht eingebunden (also auf Textebene nicht). Wie können dann die Konstanten noch vorhanden sein die in "memory_const.h" vereinbart wurden, wenn der Text doch wegen den Guards nur einmal in den ganzen Quelltexten eingebunden werden kann?
-
Hast du die "memory_const.h" in mehreren Dateien eingebunden? Include-Guards verhindern nur das mehrfache Einbinden bei einer ÜE, aber natürlich nicht bei mehreren ÜE.
-
ich habe in der "main" Datei die Konstanten eingebunden, und in einer zweiten Datei die ebenfalls in die "main" includet wurde und ich dachte das die Guards genau dann verhindern sollen das der Text zweimal eingebunden wird.
-
Include guards verhindern, dass ein inkludierter Textblock in einer Übersetzungseinheit mehrmals vorkommt. Eine Übersetzungseinheit ist in der Regel mit einem .cpp-File gleichzusetzen. Hast du nun aber zwei ÜE, die beide dieses Include-File verwenden, werden Variablen (oder auch Konstanten), die nicht extern oder static sind, in jede dieser beiden ÜE eingebunden. Der Linker beschwert sich dann, dass sie doppelt definiert sind.
-
also alles static deklarieren und das Problem ist unter allen denkbaren Umständen behoben?
-
Nein, aber wenn's einfache Zahlenkonstanten sind, dann schon.