Quellcode trennen



  • Hallo..
    Ich habe des öfteren gelesen, das man sinnvoller Weise den Quellcode trennen sollte und beispielsweise Funktionsprototypen in einer Header Datei ablegt. Soweit ist mir das auch klar. Aber wo schreibe ich denn rein, was die Funktion letztendlich tun soll? Ich steige da nicht so ganz durch und finde über google immer nur den prinzipiellen Aufbau einer Headerdatei.

    Gruss



  • Du schreibst die Implementierung (das, was die FUnktion machen soll) in eine eigene *.cpp-Datei. Die musst du dann allerdings dem Projekt hinzufügen (wenn du eine IDE benutzt), bzw. beim Compiler/im Makefile angeben, falls du "von Hand" kompilierst.

    Beispiel:

    Quadrat.h

    #ifndef __QUADRAT_H__
    #define __QUADRAT_H__
    
    int Quadrat(int a);
    
    #endif
    

    Quadrat.cpp

    #include "Quadrat.h"
    
    int Quadrat(int a)
    {
        return a*a;
    }
    

    main.cpp

    #include "Quadrat.h"
    
    #include <iostream>
    
    using namespace std;
    
    int main(void)
    {
        cout << "Das Quadrat von " << 3 << " ist: " << Quadrat(3) << endl;
        return 0;
    }
    

    Die sogenannten Include-Guards

    #ifndef __QUADRAT_H__
    #define __QUADRAT_H__
    

    und

    #endif
    

    Sind dazu da, dass man einen Headerfile nicht 2 mal includen kann. Das ist oft nötig, um die ODR (One definition rule) zu erfüllen.

    Wenn der Header das erste mal includet wird, wird die Präprozessor-Konstante definiert, sodass beim zweiten Mal alles zwischen #ifndef und #endif nicht mehr beachtet wird.

    Felix



  • Vielen vielen Dank!



  • Eine Frage noch:

    Ich sehe in der Datei "stdlib.h" zwar die Prototypen aber ich finde nirgends eine Datei, in der der Funktionsrumpf steht. Wo sollte man die denn finden?



  • Die sind zu einer Library kompiliert, die von deinem Linker dazu-gelinkt wird, wenn du sie brauchst.



  • Also kann ich mir das garnicht ansehen? Das Problem ist ja, dass ich zwar weiss, wie die Funktionen aufgerufen werden aber ich habe keine Ahnung was da drin passiert. Gibt es keine Möglichkeit das zu sehen?



  • Feibw schrieb:

    Also kann ich mir das garnicht ansehen? Das Problem ist ja, dass ich zwar weiss, wie die Funktionen aufgerufen werden aber ich habe keine Ahnung was da drin passiert. Gibt es keine Möglichkeit das zu sehen?

    üblicherweise nicht und das ist auch gar nicht nötig. genau deshalb gibt es ja dokus. wie eine funktion intern arbeitet muss einen nicht interessieren. interessant ist nur, was man reinsteckt und was rauskommt.



  • Feibw schrieb:

    Also kann ich mir das garnicht ansehen? Das Problem ist ja, dass ich zwar weiss, wie die Funktionen aufgerufen werden aber ich habe keine Ahnung was da drin passiert. Gibt es keine Möglichkeit das zu sehen?

    Man sollte garnicht wissen was im Detail passiert. Eine Empfehlung in der Programmierung lautet: "Programmiere gegen die Schnittstelle, nicht gegen die Implementierung" (Schnittstelle sind in dem Fall die public-Member im Header, oder für Ableitungen ggf. auch noch die protected-Member).

    Der Vorteil hieran ist, das man nachträglich auch noch die Implementierung ändern kann (z.B. weil man entweder noch nicht alle Funktionalität implementiert hat, oder Korrekturen/Optimierungen durchführt) ohne das man die aufrufenden Stellen ändern muss. Bedingung ist hierbei natürlich das die Schnittstelle die gleiche bleibt.

    cu André


Anmelden zum Antworten