problem mit mehreren (c-)Dateien, headerproblem



  • Moin,

    ich habe

    main.cpp:

    #include "mein.h"
    
    int main()
    {
    	int zahl = 0;
    
    	scanf("%d", &zahl);
    	zahl_zeigen(zahl);
    
    	return(0);
    }
    

    mein.h:

    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    #ifndef _mein_header
      #define _mein_header
    
      #ifndef _zahl_zeigen
        void zahl_zeigen(int zahl);
        #include "zahl_zeigen.cpp"
      #endif
    
    #endif
    

    und zahl_zeigen.cpp:

    #define _zahl_zeigen
    #include "mein.h"
    
    void zahl_zeigen(int zahl)
    {
    	printf("Zahl: %d\n", zahl);
    
    	return;
    }
    

    Wenn ich das jetzt mit MinGW compilieren lasse, heißt es:

    D:\C\MinGWStudio\Templates\Neues_tut\Debug\zahl_zeigen.o(.text+0xa): In function Z11zahl_zeigeni': D:\\C\\MinGWStudio\\Templates\\Neues\_tut\\zahl\_zeigen.cpp:5: multiple definition ofzahl_zeigen(int)'
    D:\C\MinGWStudio\Templates\Neues_tut\Debug\main.o(.text+0xa):D:\C\MinGWStudio\Templates\Neues_tut\zahl_zeigen.cpp:5: first defined here

    [Der Quellcode ist jetzt zu einem Beispiel gekürzt und hat keinen großen Sinn, nur für Leute die fragen wollen]

    Ich habe üüüüüüüüüberhaupt keine Idee, woran das liegt oder wie ich das problem umgehen könnte.

    Ich hoffe, das ihr mir helfen könnt,

    euer ItsNotYou



  • du übertriebst etwas mit deinen #defines.
    wenn du mein.h folgendermassen änderst sollte es funktionieren.

    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    #ifndef _mein_header
    #define _mein_header
    
    void zahl_zeigen(int zahl);  
    
    #endif
    

    Kurt



  • du übertriebst etwas mit deinen #defines.
    wenn du mein.h folgendermassen änderst sollte es funktionieren.

    #include <windows.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    #ifndef _mein_header
    #define _mein_header
    
    void zahl_zeigen(int zahl);  
    
    #endif
    

    Kurt



  • Das Problem kommt daher, dass du durch das "include zahl_ziehen.cpp" die Funktionsdefinition in der Main hast (da include vom Praeprozessor ja einfach als einkopieren der Datei verstanden wird) und in der zahl_ziehen.cpp, dadurch ist die Funktion doppelt definiert. Nochmal als Beispiel
    A.cpp:

    ...definition of class A...
    

    B.cpp

    #include "A.cpp"
    ...definition of class B...
    

    wird zu

    ...definition of class A...
    ...definition of class B...
    

    In dem kompilierten Objekt B.o steckt also komplett A drin.

    Daher zwei wichtige Regeln:
    1. Deklarationen in den Header, Definitionen in den Body
    2. include NUR mit Headern, niemals den Body

    Wenn man die bedenkt kommt das Problem nicht mehr vor. Ist bei kleinen Sachen vll etwas viel Overhead, aber besser so als anders.


Anmelden zum Antworten