Bedingte Compilierung
-
Hallo...
ich arbeite zum ersten mal mit mehereren Quellcode dateien. In all diesen Dateien brauchen ich auch die selben
Headerdateien, so dass ich diese in einer eigenen Headerdatei Zusammenfasse und in allen Quelltextdateien zur verfühung stelle.
Der Linker meldet dann aber, dass meine Klassen (die ich anderen headerdateien zusammenfasse) bereits in einer
Objektdatei einer Quelltextdatei definiert sind, und zwar der ersten die Übersetzt wurde. Dabei lasse ich meine Headerdatei bedingt übersetzen, so dass mehrfaches Include eigentlich ausgeschlossen wird.
BSP:
//header.h#ifndef TEST
#define TEST#include "eigenheader1"
#include "eigenheader2"
#include "windows.h"
#include "stdio.h"void ein_Paare_Funktionen();
#endif
//Sollte doch nur einmal abgearbeitet werden!!
//quell 1
#include "header.h"//quell 2
#include "header.h"Fehelrmeldung:
Klasse aus header1/2 sind bereits in quell1.obj definiert.
Ich habe in die #ifndef Körper eine Compilermeldung eingebaut: #pragme message ("Hallo"). Diese Meldung wird bei jedem Include der Headerdatei ausgegeben, was doch eigentlich (laut meinem Lehrbuch) nicht sein darf.
Ich wäre für jeden vorschlag dankbar, da ich sonst nicht weiterkomme. Vielleicht gibt es auch noch andere Möglichkeiten in mehren Quellcodedateien, ein Headerdatei einzubinden.Vielen Dank.
-
Die #include-Guards schützen dich nur davor, dass dieselbe Headerdatei mehrfach in derselben Übersetzungseinheit (= .cpp-Datei) eingebunden wird.
Über eine mehrfache Klassendefinition sollte sich aber der Linker nicht beschweren. Wie lautet die Fehlermeldung genau, und wie sieht der Inhalt der Headerdatei aus?
-
Leider kann ich die Fehlermeldung nicht genau angeben, da ich jetzt nicht an mein Programm rankomme, ebenso die Headerdatei. In der Headerdatei sind jeweils eine Klasse mit allen Funktionsdefinitionen drin.
BSP:class Klasse1
{
int Variable=1;
protected
int Methode1();};
int KLasse1::Methode1()
{
....
return Variable 1
}Diese Header brauche ich dann in allen Quellcodedateien.
Die Fehlemeldung sagt in etwa aus aus:Klassenname::MethodenName() ist bereits in main.obj definiert.
Dabei ist main.obj die erste datei die übersetzt wird.
-
Du musst die Methoden entweder inline definieren, oder in einem Modul, aber niemals einfach so in einem Header. Der wird ja in mehrere Module eingebunden. Dann haste pro Modul eine definition der Methode, was nicht gut geht.
-
Vielen DAnk