Namensräume einbinden

Wer C++ lernt, sieht zunächst häufig folgendes „Hello-World“-Programm als erstes:

#include <iostream>
 
using namespace std;
 
int main( void )
{
  cout << "Hello World" << endl;
}

In diesem Tutorial wird fast alles mit der C-Funktion printf() abgehandelt, weil sie - sofern sie mit #include <stdio.h> eingebunden wird, im globalen Namensraum liegt und ich mir für den Einstieg die Erklärung spare, was Namensräume sind.

Was Namensräume sind, wurde zuvor erklärt, es wurde erklärt wofür sie gut sind und nun erkläre ich, weshalb das erste Programm, dass in den meisten C++-Büchern vorgestellt wird, das Konzept auch wieder ein wenig ad absurdum führt.

Namensräume wurden geschaffen, um Funktionalität nicht miteinander zu vermengen. Deswegen hat man sämtliche Standard-Funktionalität in den Namensraum std geschoben, damit der Entwickler den globalen Namensraum frei für seine eigenen Identifier hat.

using namespace

Die Anweisung using namespace std; macht diese Anstrengung nun rückgängig, in dem alle Identifier (printf, cout, …) wieder in den globalen Namensraum importiert werden. Deswegen muss man auch nicht mehr std::cout « „Hello World“ « std::endl; schreiben, denn cout und endl sind dem globalen Namensraum ja nun bekannt.

Diese Anweisung ist dann hilfreich, wenn man in einer Quelltextdatei sich zum größten Teil mit einem Bereich beschäftigt. Ansonsten widerspricht using namespace der Idee von Namespaces. Entsprechend ist sie mit Vorsicht und Voraussicht nur in ausgewählten Quelltexten einzusetzen. Das bedeutet, dass sie auch nicht in Headerdateien (*.h) eingesetzt werden sollte. In Headern sollte man die Namespaces ruhig ausschreiben, auch um zu dokumentieren, woher die verwendeten Klassen kommen.

using

using ist die bessere, aber auch aufwendigere Alternative. Wir haben using bereits beim Import von Membern bei Mehrfachableitungen kennengelernt. Und ebenso funktioniert using in Namenräumen. Man kann explizit einzelne Identifier aus einem Namensraum importieren, die man häufig benötigt - andere, die man nicht oder nur sehr selten benötigt, aber weglassen. Die schönere Variante wäre hier also:

#include <iostream>
 
using std::cout;
using std::endl;
 
int main( void )
{
  cout << "Hello World" << endl;
}

Natürlich sind Identifier, die nur ein einziges Mal verwendet werden besser direkt zu referenzieren:

  std::cout << "Hello World" << std::endl;