Hey,
ich merke ich verlerne C++ immer mehr und mittlerweile bereiten mir doch einfachste Dinge Kopfzerbrechen. Für mein aktuelles anliegen ergibt C++ als Sprache aber nun mal Sinn und von daher muss ich da durch.
Ich habe im Prinzip eine Header-Datei die Funktionen bereit stellen soll. Hier Beispielsweise "worker.h":
|
C-/C++-Quelltext
|
1
2
3
4
5
|
#pragma once
bool doWork() {
return true;
}
|
Nun habe ich zwei Klassen die in ihren Implementierungen darauf zugreifen sollen, hier einfach mal "Consumer1" und "Consumer2":
Consumer1.h: (Consumer2.h sieht im Prinzip genau so aus)
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
|
#pragma once
class Consumer1
{
public:
Consumer1(void);
~Consumer1(void);
};
|
Consumer1.cpp: (Consumer2.cpp sieht im Prinzip genau so aus)
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include "Consumer1.h"
#include "worker.h"
Consumer1::Consumer1(void)
{
doWork();
}
Consumer1::~Consumer1(void)
{
}
|
main.cpp:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
|
#include "Consumer1.h"
#include "Consumer2.h"
int main() {
Consumer1 cons;
Consumer2 cons2;
}
|
Fehlermeldung ist:
|
Quellcode
|
1
2
|
1>Consumer2.obj : error LNK2005: "bool __cdecl doWork(void)" (?doWork@@YA_NXZ) ist bereits in Consumer1.obj definiert.
1>H:\development\c++\LinkerTest\Debug\LinkerTest.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.
|
Ich bin mir einfach nicht sicher wie ich das lösen soll. Ich dachte durch #pragma once würde ich mehrfache Einbindung im Code schon mal unterbinden. Nun binde ich die Datei ja in den CPP Files ein. Ich bin mir nicht mehr ganz sicher, aber die werden glaube ich eh gesondert übersetzt und dann macht die doppelte Definition ja auch Sinn. Wie umgehe ich das jetzt aber. Wenn ich andere Header inkludiere gibt es ja auch keine Probleme?
Habe auch Include-Guards mit define versucht. Selbes Ergebnis. Was ja nach meiner Logik auch durchaus Sinn ergibt.
Ich bin mittlerweile einfach zu verwöhnt von höheren Sprachen und merke dass ich auch einiges an Hintergrundwissen nicht mehr habe. An sich handelt es sich hier ja um eine Kleinigkeit.