C++ Uebersetzungseinheiten

Übersetzungseinheiten mit Headerdatei und Implementierungsdatei. Projektdateien richtig Linken und Kompilieren,



Übersetzungseinheiten in C++

Ein Programm besteht in den wenigsten Fällen aus nur einer Datei. Der Hintergrund liegt darin, die Übersichtlichkeit durch Strukturierung zu verbessern und um größere Arbeiten in einem Projekt auch sauber aufteilen zu können.

In C++ werden Dateien in Headerdateien >>*.h<< und Implementierungsdateien >>*.cpp<< gegliedert und beim späteren Gebrauch die *.h-Datei über die Präprozessoranweisung
#include "Datei.h" in die gewünschte Datei hineinkopiert


Headerdatei
Die Headerdatei beinhaltet Deklarationen, welche in mehreren Übersetzungseinheiten benutzt werden sollen.


Implementierungsdatei
Die Implementierungsdatei enthält den eigentlichen Code.



Übersetzungseinheiten erstellen und zum Programm kompilieren
Wir erstellen nun ein einfaches Programm mit folgenden drei Dateien:
* main.cpp
* helloWorld.h
* helloWorld.cpp

// main.cpp
#include "helloWorld.h"
 
 
int main ( )
{
  printHello();
 
  return 0;
}
// helloWorld.h
 
void printHello();
extern text* Name;
 
// helloWorld.cpp
#include <iostream>
#include "helloWorld.h"
 
 
void printHello ( )
{
  std::cout << "HelloWorld!" << endl;
}
 
Um diese drei Dateien richtig zu einem einzigen Programm zusammen zu fügen, muss für jede *.cpp-Datei eine Objektdatei erzeugt werden, welche dann zusammen mit der main.cpp zu einer Ausführbaren Datei gelinkt wird.
// Mit GNU GCC-Compiler Programm erstellen
// Schritt 1. Übersetzen
// Schritt 2. Linken


// Schritt 1: Aus cpp Objektdateien mit Endung *.o erzeugen
g++ -c helloWorld.cpp
g++ -c main.cpp


// Schritt 2: Objektdateien zu einer Ausführbaren Datei linken
g++ main.o helloWorld.o -o a.out
Mehrfaches Kopieren verhindern
Um ein mehrfaches Kopieren einer Inkludierten Header-Datei zu verhindern, sollte jede Header-Datei mit folgenden Präprozessoranweisungen geschützt werden:
#ifndef HELLO_WORLD
#define HELLO_WORLD
 
  /*
  * Hier der eigentliche Code
  */
 
#endif
Der bei #ifndef und #define angegebene Name HELLO_WOLRD darf in allen Übersetzungseinheiten nur einmal vorkommen. Daher wird standardmäßig der Name der DATEI in Großbuchstaben verwendet. Es könnte aber auch jeder andere einmalig vorkommende Name verwendet werden!