Code auf mehrere Dateien verteilen



  • Ich würde gerne einige Funktionen, die ich im Hauptprogramm brauche, in eine externe Datei auslagern. Etwa so:

    main.c:

    #include "main.h"
    #include "function.c"
    
    mystruct_t global_variable_needed_everywhere;
    
    void func1();
    
    int main()
    {
       func1();
       return 0;
    }
    
    void func1()
    {
       global_variable_needed_everywhere.a = 1;
       global_variable_needed_everywhere.b = MYCONST;
       func2();
    }
    

    main.h:

    #define MYCONST 42
    
    typedef struct
    {
       int a;
       int b;
    } mystruct_t;
    

    function.c:

    #include "main.h"
    // irgendwie muss ich hier noch an die global_variable_needed_everywhere kommen,
    // aber #include "main.c" geht ja nicht...
    
    void func2();
    
    void func2()
    {
       global_variable_needed_everywhere.a *= MYCONST;
    }
    

    Wie kann ich das Problem am besten lösen?



  • Also der Clou ist, dass du func2() auch in der main.c aufrufen kannst? Ohne fieß sein zu wollen, aber hast du dir schonmal die Funktionen der unterschiedlichen Datein (.c-Datei und .h-Datei) angeschaut?
    Man kann dann nämlich den Funktionsprototypen anstatt in den Kopf der c-Datei auch in eine separate h-Datei schreiben und diese dann überall einbinden (incluse), wo man diese Funktion verwenden möchte.



  • Nu hab ich den anderen Thread von dir gesehen:
    Ein include bindet die angegebene Datei so ein, als ob sie direkt dort stehen würde. Wenn du eine c-Datei einbindest wird der Compiler (bzw. Linker, ich kann die nie auseinanderhalten) Meckern, weil es die Funktion zweimal gibt oder so. Darum macht man das mit einem Konstruktor in der h-Datei, den kann es nämlich auch öfter geben. Und wenn du dann noch

    #ifndef NAME_H
    #define NAME_H
    
    // Header Inhalt
    
    #endif
    

    in der h-Datrei verwendest, ahst du es richtig schick!



  • Erst mal danke für die ausführlichen Antworten, nur habe ich noch ein Problem: Wie kann ich die global_variable_needed_everywhere auch der func2() in function.c bekannt machen? Wenn ich die Variable auch in der main.h definiere, funktioniert es zwar, aber ist das bei einem größeren Projekt nicht irgendwie unschön, alle Variablen, die in mehreren Dateien gebraucht werden, in einer Headerdatei zu definieren?



  • es gibt das keywort extern, damit kann man handles importieren/exportieren, weiß nich genau, google is dein freund, wenn hier nicht einer schneller ist.



  • Das "extern" hab ich vergessen. Das darfst du auch in der Header-Datei davor schreiben.
    Eigentlich ist es nicht unschön, so kommt der Klassengedanke durch. Im Prinzip ist deine Headerdatei wie eine Klasse, mit den public Eigenschaften (extern Variablen geht nämlich auch) und public Methoden. Und überall, wo du diese Klasse verwenden möchtest, bindest du sie ein. Nur dass es die Klasse halt nur einmal gibt, aber selbst das könnte man elegant nachbuaen 😉


Log in to reply