mehrfach definiert



  • hallo,

    ich bekomme immer den linkerfehler "multiply defined"

    ich binde meine eigene header in die main ein, rufe dann in der int main(void) eine funktion meiner eigenen header auf und verwende variablen, die ich in meiner eigenen header deklariert habe.

    wie kann ich den linkerfehler "multiply defined" beheben?

    war da irgendwas mit "extern" oder so??? 😮

    gruß



  • Im Header haben Definitionen nichts zu suchen - wenn du den selben Header in mehreren Übersetzungseinheiten hast, kommt es sonst zu diesem Fehler. Als Lösung schreibst du in den Header nur die Deklarationen (extern-Variablen bzw. Funktions-Prototypen), die passenden Definitionen kommen in eine eigene C-Datei, die du mit an den Linker übergibst:

    //daten.h
    #ifndef DATEN_H
    #define DATEN_H
    
    typedef struct
    {
      int v1;
      char v2;
    } data_t;
    
    data_t create_data(int,char);
    
    extern data_t global_data;
    
    ...
    
    #endif
    
    //daten.c
    #include "daten.h"
    
    data_t create_data(int ival,char cval)
    {
      data_t tmp = {ival,cval};
      return tmp;
    }
    
    data_t global_data = {0,'0'};
    
    ...
    

    (edit: Include-Guards ergänzt - die helfen zwar nicht gegen Linker-Fehler, aber immerhin gegen Probleme mit Doppeleinbindung)



  • stimmt das dann so

    main.c:

    extern int Funktion(int, int);
    extern int var1;
    extern var2;
    
    int main(void)
    {
        Funktion(var1,var2);
    
        return 0;
    }
    

    Daten.h:

    int var1;
    int var2;
    

    Daten.c:

    int Funktion(int var1,int var2)
    {
        ...
    }
    


  • Nein - in der "daten.h" brauchst du die 'extern'-Angaben (bei den Funktionen übrigens nicht unbedingt, die sind automatisch extern, wenn du den Funktionsrumpf weglässt), die zugehörigen Definitionen ("int var1;" etc) gehören in die "daten.c".

    (und das Hauptprogramm benötigt dann nur ein "#include "daten.h" am Anfang)



  • so jetzt aber:

    in main.c:

    #include "Daten.h"
    
    int main(void)
    {
        Funktion(var1,var2);
    
        return 0;
    }
    

    in Daten.h:

    #ifndef Daten_H
    #define Daten_H
    extern Funktion(int, int);
    extern var1;
    extern var2;
    #endif
    

    in Daten.c:

    #include "Daten.h"
    
    int Funktion(int var1,int var2)
    {
        var1 = 1,
    }
    


  • 😮 var1 und var2 sind doch nur Parameter deiner Funktion? Oder habe ich jetzt etwas übersehen? In dem Fall brauchst du sie gar nicht als eigenständige Variablen anzulegen: "extern int v;" deklariert eine globale Variable.



  • und wenn ich diese als globale Variable nehmen möchte!?



  • Dann musst Du sie in daten.c auch noch definieren.

    Aber was für einen Sinn macht es einer Funktion, die zwei Parameter annimmt, zwei globale Variablen zu übergeben deren lokale Kopien auf dem Stack der Funktion dann verändert werden 😕



  • Ich kommt nicht weiter...

    Wie soll ich das denn da machen, wenn ich die 2 Parameter int var1 und int var2 (sind Parameter der Funtkion in mehreren anderen Funtkionen benutzen möchte?



  • Du kannst von dieser Funktion aus auch beliebige andere Funktionen aufrufen, z.B:

    int Funktion(int v1,int v2)
    {
      Func2(v1);
      Func2(v2);
      return v1+v2;
    }
    
    int main()
    {
      int i,j,k;
      ...
      k=Function(i,j);
      ...
    }
    


  • also hab ich das doch eigentlich richtig gemacht



  • Ja, nur die "extern int..." Deklarationen benötigst du nicht (globale Variablen solltest du sowieso nur in Ausnahmefällen einsetzen - wenn du Daten zwischen zwei Funktionen austauschen willst, ist es sicherer, über Parameter oder Rückgabewerte zu gehen).



  • ok, ich denke ich habe es jetzt kapiert.

    danke 👍


Anmelden zum Antworten