Lektion 48:

Übersetzungseinheiten

 Ein C++-Programm besteht normalerweise aus mehreren Übersetzungseinheiten. Eine Übersetzungseinheit besteht dabei aus einer cpp-Datei. Bisher hat jedes Ihrer Programme aus nur einer cpp-Datei bestanden. Das soll nun geändert werden. Als Beispiel nehme ich das Programm, das drei Zahlen sortiert.

  • Erstellen Sie mit Ihrer C++-Entwicklungsumgebung ein neues Projekt.
  • Fügen Sie eine Datei namens main.cpp ein.
  • Öffnen Sie die Datei main.cpp und fügen Sie folgenden Code ein:
#include <iostream.h>
void main()
{
   int a=3;
   int b=5;
   int c=2;
   sort(&a,&b,&c);
   cout<<a<<endl;// Ausgabe: 2
   cout<<b<<endl;// Ausgabe: 3
   cout<<c<<endl;// Ausgabe: 5
};

Die sort-Funktion soll in einer eigenen Übersetzungseinheit stehen.

  • Fügen Sie eine Datei namens sort.cpp ein.
  • Öffnen Sie die Datei sort.cpp und fügen Sie folgenden Code ein:
void sort(int *px,int *py)
{
   if(*px>*py)
      swap(px,py);
};
void sort(int *pa,int *pb,int *pc)
{
   // die kleinste Zahl nach vorn (pa) ziehen
   sort(pa,pb);
   sort(pa,pc);
   // die zweitkleinste Zahl nach vorn (pb) zeihen
   sort(pb,pc);
   // fertig
};
  • Fügen Sie eine Datei namens swap.cpp ein.
  • Öffnen Sie die Datei swap.cpp und fügen Sie folgenden Code ein:
void swap(int *pa,int *pb)
{
   int tmp=*pa;
   *pa=*pb;
   *pb=tmp;
};
  • Compilieren Sie jetzt das Projekt.

Sie sollten die folgenden Fehlermeldungen erhalten:

e:\SOURCE\cppkurs\test\main.cpp(8) : error : 'sort' : undeclared identifier
e:\source\cppkurs\test\sort.cpp(4) : error : 'swap' : undeclared identifier

Falls Ihr Compiler die Fehlermeldungen deutsch ausgibt:

e:\SOURCE\cppkurs\test\main.cpp(8) : error : 'sort' :nichtdeklarierter Bezeichner
e:\source\cppkurs\test\sort.cpp(4) : error : 'swap' :nichtdeklarierter Bezeichner

Die Fehler liegen daran, daß die drei Übersetzungseinheiten main.cpp, sort.cpp und swap.cpp wirklich völlig unabhängig voneinander compiliert werden.

Wir kümmern uns zunächst nur um den ersten Fehler. Um diesen Fehler zu beseitigen, müßte in der Datei main.cpp Bescheid gesagt werden, daß es die sort-Funktion gibt.

  • Schreiben Sie jetzt den Funktions-Kopf gefolgt von einem Semikolon in die Datei main.cpp. Die Datei main.cpp sollte jetzt so aussehen:
#include <iostream.h>
void sort(int *pa,int *pb,int *pc);
void main()
{
   int a=3;
   int b=5;
   int c=2;
   sort(&a,&b,&c);
   cout<<a<<endl;// Ausgabe: 2
   cout<<b<<endl;// Ausgabe: 3
   cout<<c<<endl;// Ausgabe: 5
};

Der eine Fehler ist weg. Die Methode, das zu erreichen war aber nicht schön. Schöner geht es mit Header-Dateien. Header-Dateien sind solche Dateien, die Sie immer mit #include inkludieren.

Inkludieren Sie niemals eine cpp-Datei!

  • Erzeugen Sie jetzt eine Datei namens sort.h. Öffnen Sie diese Datei und fügen Sie folgenden Code ein:
void sort(int *pa,int *pb,int *pc);
  • Entfernen Sie den Funktions-Kopf der sort-Funktion aus der Datei main.cpp und inkludieren Sie dort statt dessen die Datei "sort.h" (mit Anführungszeichen). Die Datei main.cpp sollte jetzt so aussehen:
#include <iostream.h>
#include "sort.h"
void main()
{
   int a=3;
   int b=5;
   int c=2;
   sort(&a,&b,&c);
   cout<<a<<endl;// Ausgabe: 2
   cout<<b<<endl;// Ausgabe: 3
   cout<<c<<endl;// Ausgabe: 5
};

 Die Anführungszeichen bedeuten dabei, daß der Compiler die Datei sort.h zuerst in dem Verzeichnis suchen soll, wo Ihre cpp-Dateien auch stehen. Das Kommando #include wirkt vor der eigentlichen Übersetzung durch den Compiler und kopiert einfach den Inhalt der inkludierten Datei in die gerade zu übersetzende Übersetzungseinheit.

Zur Sicherheit ist es gut, wenn die Datei sort.cpp die Datei sort.h auch inkludiert.

  • Erstellen Sie entsprechend eine Datei swap.h und inkludieren Sie diese in swap.cpp und sort.cpp.

Im folgenden wird es günstig sein, wenn Sie immer dasselbe Projekt für diesen Kurs verwenden. Lassen Sie die Datei, welche die main-Funktion enthält immer main.cpp heißen. In dieser Datei erstellen Sie auch die neuen Funktionen oder Klassen. Immer, wenn ein zusammengehöriger Satz von Funktion oder Klassen fertig ist, lagern Sie den neuen Code, sofern anzunehmen ist, daß Sie ihn wiederverwenden möchten, in eigene Dateien aus. In späteren Lektionen und Übungen können Sie dann die entsprechenden Funktionen oder Klassen einfach verwenden, indem Sie die entsprechende Header-Datei inkludieren.

Falls Sie jetzt schon Lust haben, alle brauchbaren Sachen auszulagern, so beachten Sie bitte, daß Klassen (so, wie wir sie bisher geschrieben haben) nur in eine entsprechende Header-Datei gelegt werden. Bis auf weiteres brauchen Sie (im Gegensatz zu Funktionen) keine cpp-Dateien.

Übung:

Lagern Sie alle bisher erstellten Funktionen und Klassen in entsprechende Dateien aus. Dabei soll jede Klasse eine eigene Datei bekommen. Bei Funktionen entscheiden Sie, welche zusammengehören und wählen Sie aussagekräftige Dateinamen.

Einsendungen:

Lösungsvorschlag


Falls Ihnen Fehler im Text auffallen oder Sie Verbesserungsvorschläge haben, dann schicken Sie mir bitte eine Mail. Ich werde mich dann sofort darum kümmern.
[aktuelle Version] [inhalt] [index]      [Fehlerkorrektur, Verbesserungsvorschlag]

© Volkard Henkel <volkard@normannia.de>, last update: 08/25/00