Von cppreference:
Eine using-Direktive, die Namen der Inline-Namespace implizit in der einschließenden Namespace (ähnlich der impliziten using-Direktive für die unbenannte Namespace) eingefügt ist.
Zum Beispiel in dem folgende Beispiel macht using namespace std::string_literals
die Bediener sichtbar im Innern des -umfang:
{ // in C++14, std::literals and its member namespaces are inline
using namespace std::string_literals; // makes visible operator""s
// from std::literals::string_literals
auto str = "abc"s;
}
Wenn Sie die using
Richtlinie außerhalb eines Bereichs (zum Beispiel wie in Ihrem Beispiel) verwenden, Schmerzen Folgen Sie, wie die Kommentatoren sagten, insbesondere, wenn diese Datei eine Header-Datei ist: Dieser Namespace wird implizit in jede Datei importiert, die diese Datei enthält. Aus diesem Grund sollten Sie ein großes Projekt verwalten, indem Sie Ihren eigenen Namespace erstellen und alle benutzerdefinierten Objekte in diesem neuen Namespace platzieren. Wenn Sie wirklich eine using
Direktive verwenden müssen, tun Sie dies in der Implementierungsdatei, niemals in der Kopfzeile und idealerweise innerhalb von Bereichen. Dies wird Ihnen helfen die meisten Konflikte zu vermeiden, es sei denn, Ihr Namensraum einen gemeinsamen Namen verwendet:
namespace Matrix{ <--- Bad practice, Matrix will probably conflict with something
myStuff ...
}
namespace JohnsAwesomeMatrix236790{ <--- Namespace name is unique,unlikely to get conflicts.
myStuff ...
}
Außerdem ist es viel sicherer, die wenigen Funktionen zu importieren, die Sie anstelle des gesamten Namespace verwenden:
using namespace std; // Imports the entire namespace!
using std::cout; // Much better, we only import
using std::endl; // the names of the two functions we use a lot
Jede anständig geschriebene Bibliothek, die Sie verwenden, wird sehr vorsichtig die using
Direktive (wenn überhaupt) verwenden, so dass Sie sich normalerweise keine Sorgen machen müssen. Wenn Sie jedoch Code verwenden, der mit weniger strengen Standards (z. B. wissenschaftlichen Code) geschrieben wurde, sollten Sie darauf achten.
ja, was kann es noch sein – artm
Ersparen Sie sich die zukünftigen Kopfschmerzen und nie 'namespace std verwenden;' im Dateiumfang. – StoryTeller
Alle std :: -Klassen und -Funktionen, die in diesen Header-Dateien deklariert sind, stehen im globalen Namespace zur Verfügung. Und ich stimme @ StroyTellers Gefühl. Wenn Sie dies tun, werden irgendwann Schmerzen folgen. Insbesondere, wenn Sie Bibliotheken mit ähnlichen Namen verwenden - z. boost –