Übersetzungseinheiten

Wenn wir ein großes Projekt haben, empfielt es sich den Code auf mehrere Dateien aufzuteilen. Dies erspart zB auch Zeit beim kompilieren, denn es müssen nur die Dateien die geändert wurden, neu kompiliert werden.

In Header-Dateien stehen nur Deklarationen bzw. Interface-Definitionen (zB eine class-Definition). In den *.cpp-Dateien stehen dann die dazugehörigen Implementierungen. Es empfiehlt sich eine Klasse aufzuteilen: in Schnittstelle und Implementierung:

    //test.hpp

    //in header steht NIE ein using
    class Test
    {
    private:
      int i;
    public:
      int get() const;
      void set(int);
    };


    //test.cpp

    int Test::get() const
    {
      return i;
    }

    void Test::set(int i)
    {
      this->i=i;
    }


    //main.cpp
    #include "test.hpp"
    #include<iostream>
    using namespace std;

    int main()
    {
      Test t;
      t.set(5);
      cout<<t.get()<<'\n';
    }
    

Gängige Dateiendungen für Header-Dateien sind *.h, *.hxx, *.hh, *.hpp und *.H während gängige Endungen für Implementierungsdateien *.cpp, *.cc, *.cxx und *.C sind. Im Prinzip ist es egal welches Namensschema du dir aussuchst - wichtig ist nur, dass du dabei bleibst.

Erklärung zu Übersetzungseinheiten

Der Präprozessor fügt die verschiedenen Dateien zusammen, der Compiler kompiliert die Dateien zu sognenannten 'Objekt Dateien'. Der Linker fügt diese zu einem Programm zusammen.

In den Header-Dateien stehen die Informationen die alle Implementierungs-Dateien gemeinsam nutzen. So steht in der Datei 'iostream' alle Informationen über cout und cin.

Mehrere Übersetzungseinheiten lassen sich bei der GCC etwa so kompilieren: g++ test.cpp main.cpp.

Übersetzungseinheiten führen uns zu der sogenannten ODR (One Definition Rule).

Die ODR besagt, dass jede Funktion, Variable, etc. nur exakt eine Definition haben dürfen. Benjamin Kaufmann (alias HumeSikkins) hat folgenden interessanten Text über die ODR geschrieben: Was besagt die one definition rule (ODR)?

.

top