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 😉


  • Mod

    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).


Anmelden zum Antworten