2011-01-04 14 views
2

Immer wenn ich Bücher über C++ lese, finde ich ein Beispiel für "using namespace std".nützliche Namespaces in C++ außer "Std"

Ich würde gerne wissen, ob irgendwelche anderen Namespaces in C++ vorhanden sind, die nützlich sind?

+14

Brennen Sie diese Bücher. –

Antwort

12

boost.
std::tr1. (Technischer Bericht 1)

Aber using namespace std; ist keine gute Idee, und vor allem nicht in Header-Dateien. Es ist 5 zusätzliche Zeichen jedes Mal, wenn Sie es verwenden, für deutlicheren Code und weniger Zusammenstöße.

5

Alles in der C++ - Standardbibliothek befindet sich im Namespace std (oder einem verschachtelten Namespace unter std).

Andere Bibliotheken verwenden natürlich andere Namespaces. Sie sollten die Dokumentation aller anderen Bibliotheken lesen, die Sie verwenden, um festzustellen, welche Namespaces sie verwenden.

Das heißt, die Verwendung von Direktiven sind in der Regel eine schlechte Idee. Es ist viel besser, mithilfe von Deklarationen einzelne Namen aus einem Namespace zu verwenden. Dies ist besonders wichtig für den Namespace std. Es gibt viele häufig verwendete Namen im Namespace std und es ist einfach, in schwer zu lösende Probleme einzutreten, wo Sie versuchen, auf Ihre eigene Funktion oder Klasse zu verweisen und versehentlich auf eine Standardbibliotheksfunktion oder -klasse zu verweisen. Zum Beispiel ist das schlecht:

using namespace std; 
cout << "Hello world" << endl; 

Das ist besser:

using std::cout; 
using std::endl; 
cout << "Hello world" << endl; 

Meiner Meinung nach, Code ist in der Regel sauberen, wenn Sie voll qualifizierte Namen in Ihrem Programm verwenden; dies macht es klarer in dem Unternehmen kommen aus und lässt weniger Raum für Fehler.

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

(Ausnahmen gibt es für alle diese Regeln, natürlich Wenn zum Beispiel std::bind verwenden, es ist ein schlagendes std::placeholders::_1 zu verwenden und seine Freunde. Es ist viel einfacher Code zu lesen, die using std::placeholders; verwendet und dann beziehen sich nur auf _1, _2 usw. die Verwendung Richtlinie innerhalb der Funktion sein sollte, aber nicht im Namespace Umfang.)

+0

Den letzten Kommentar ignorieren.(Bill, es ist 'namespace po = boost :: program_options', nicht' namespace verwenden po = boost :: program_options') –

0

Dies ist der Namensraum für die C++ Standardbibliothek. AFAIK Dies ist der einzige Namespace, den Sie "out-of-the-box" haben. Alle anderen müssen Sie selbst definieren oder Sie erhalten sie von anderen Bibliotheken.

0

Alle Dateien in der C++ - Standardbibliothek deklarieren alle ihre Entitäten im std-Namespace. Sie werden nur dann auf andere Namespaces treffen, wenn Sie eine Bibliothek eines Drittanbieters verwenden (z. B. boost) oder eigene Namespaces definieren.

2

Ich bin überrascht, niemand erwähnte den std::rel_ops Namensraum. Es definiert operator!=, operator>, operator<= und operator>=.

Sie können diese im Geltungsbereich durch eine using-Direktive oder Deklaration und definieren Sie eine operator< und operator== für Ihren Typ. Die Betreiber von std::rel_ops arbeiten dann in Bezug auf diese beiden.