Wie *.cpp richtig compilieren?
-
Hallo,
wenn ich richtig informiert bin interpretiert der ms vc compiler *.c Dateine als c-code und *.cpp dateien als c++ Code und man kann in *.cpp Dateinen normalen c-code bentzen. Ich habe jetzt eine Fensteranwendung und die Funktionen sind in 3 *.c Dateien und in der *.h Datei sind die Funktionen und auch Variablen hintherlegt die ich in beiden *.c Dateien verwende. Wenn ich jetzt die *.c Dateien in *.cpp Dateien umbennene dann motzt der Compiler mit folgender Fehlermeldung. Mit c als Dateiendung klappts, was mach ich falsch? Achja wenn ich alles in eine cpp datei reinpacke und die Headerdateiweglasse gehts auch.
Kompilierung läuft... main.cpp proceduren_winapi.cpp tab_control.cpp Linker-Vorgang läuft... tab_control.obj : error LNK2005: "struct HWND__ * tabControl" (?tabControl@@3PAUHWND__@@A) bereits in main.obj definiert tab_control.obj : error LNK2005: "long (__stdcall* originalTabCtrlWndProc)(struct HWND__ *,unsigned int,unsigned int,long)" (?originalTabCtrlWndProc@@3P6GJPAUHWND__@@IIJ@ZA) bereits in main.obj definiert tab_control.obj : error LNK2005: "struct HWND__ * mainWindow" (?mainWindow@@3PAUHWND__@@A) bereits in main.obj definiert release/main.exe : fatal error LNK1169: Ein oder mehrere mehrfach definierte Symbole gefunden Fehler beim Ausführen von link.exe. main.exe - 4 Fehler, 0 Warnung(en)
-
In den Headern sollten keine Definitionen stehen, sondern nur Deklarationen:
falsch:
//header.h int global_value; int get_value() { return global_value; ... //functions.c #include "header.h" ... //main.c #include "header.h" ... int main() { ... }
Jetzt erzeugt der Compiler aus den beiden Quell-Dateien jeweils eine .obj - und in beiden .obj stehen die Variable global_value und die Funktion get_value(). Woher soll da der Linker wissen, welche davon die "echte" ist?
richtig:
//header.h extern int global_value; int get_value(); ... //functions.c #include "header.h" int global_value; int get_value() { return global_value; } ... //main.c #include "header.h" ... int main() { ... }
Auch hier werden beide .obj Dateien angelegt, aber nur die functions.obj enthält die Definitionen - die main.obj enthält lediglich einen Verweis darauf, daß global_value und get_value() irgendwo existieren (der Verweis wird vom Linker ausgewertet).
PS: globale Variablen sind übrigens böse
-
Danke für den Hinweis, aber warum ist das nicht gut. Wie darf ich das verstehen?
CStoll schrieb:
PS: globale Variablen sind übrigens böse
-
Aufgrund von Seiteneffekten und dadurch, dass diese Variablen, mehr oder weniger unkontrolliert von überall her geändert werden können sollte man diese aus OOP Sicht meiden (wie die Pest).