Wie soll ich generell vorgehen using
und warum? Ist es situationsabhängig (zB Header, der #include
d sein wird, vs. Quelldatei, der nicht sein wird)?
Auch sollte ich lieber ::std::
oder std::
?
Namespace-Ebene
using namespace
:using namespace std; pair<string::const_iterator, string::const_iterator> f(const string &s) { return make_pair(s.begin(), s.end()); }
Vollständig explizit sein:
std::pair<std::string::const_iterator, std::string::const_iterator> f(const std::string &s) { return std::make_pair(s.begin(), s.end()); }
Namespace-Ebene mit Deklarationen:
using std::pair; using std::string; pair<string::const_iterator, string::const_iterator> f(const string &s) { return make_pair(s.begin(), s.end()); }
Funktionslokale using-Deklarationen:
std::pair<std::string::const_iterator, std::string::const_iterator> f(const std::string &s) { using std::make_pair; return make_pair(s.begin(), s.end()); }
Funktionslokal
using namespace
:std::pair<std::string::const_iterator, std::string::const_iterator> f(const std::string &s) { using namespace std; return make_pair(s.begin(), s.end()); }
Etwas anderes?
Dies setzt Pre-C ++ 14 voraus und somit keine Return-Type-Deduktion mit auto
.
::std::
vs.std::
though.std
ohne Sekunde. Jemand, der einen std-Namespace definiert, fragt nach Problemen (und versucht wahrscheinlich, die Vorteile zu nutzen, die die meisten Leute nutzenstd
und nicht::std
).Antworten:
Vermeiden Sie die Verwendung
using
in Headern, da dies den Zweck von Namespaces verletzt.Es ist in Ordnung, es in Quelldateien zu verwenden, aber ich würde es in einigen Fällen (zum Beispiel
using std
) immer noch vermeiden .Wenn Sie jedoch verschachtelte Namespaces haben, ist dies in Ordnung:
quelle
using
Schlüsselwort verwenden sollen, ohne eine gründliche Erklärung zu haben, warum Namespaces zu Beginn verwendet werden.using std::cout
und Freunde, aber es ist nicht so, dasscout
es schon ein schrecklich langer Name ist.Wenn Sie eine using-Anweisung in eine Quelldatei einfügen, müssen Sie nur die erforderlichen Informationen eingeben. Zum Beispiel:
Das Problem hierbei ist, dass, wenn Sie dies tun
Sie ziehen JEDES EINZELNE von STD in den globalen Namespace. Dies führt zu sehr interessanten Fehlermeldungen, wenn Sie versehentlich einen Namen in Ihrem Code verwenden, der mit einem übereinstimmt, den Sie in std. Wenn Sie nur das gewünschte Material einlesen, haben Sie dieses Problem nicht (oder genauer gesagt, der nächste Programmierer, der an Ihrem Code arbeitet, wird dieses Problem nicht haben).
quelle
using namespace
nur in einem Funktionsumfang das Problem vermeiden.Verwenden Sie VJovic zufolge nicht
using
in einer Header-Datei.using
in einer Headerdatei wirkt sich auf die aktuelle Kompilierungseinheit (die CPP-Datei) in einer Weise aus, die die Quelldatei möglicherweise nicht erwartet.using namespace
ist auch in einer Quelldatei zu vermeiden. Dies bringt jedes Symbol in den gleichen Bereich wie die Quelldatei. Den Lesern wird klarer, was Sie tun, wenn Sie bestimmte Symbole aus dem Namespace verwenden.quelle
using namespace JoystickModule
Gründen würde ich, sofern Ihr Code nicht häufig verwendete Namen überschreibt, lieber am Anfang einer CPP-Datei alsJoystickModule::
an jedes Objekt angehängt sehen.using
Anweisung für meinen eigenen Namespace, an dem ich gerade arbeite, und alles andere bleibt in Namespaces.using SomeNameSpace::SomeSymbol
. Dadurch wird vermieden, dass jedes Symbol aus dem Namespace in den aktuellen Bereich verschoben wird.Schreiben
using
in Headern ist der beste Weg, um alle Arten von bösen und unmöglich zu debuggenden Fehlern zu erstellen . Mach das nicht .Das Schreiben
using namespace XYZ
in der Quelldatei ist etwas besser, kann aber dennoch unzählige Kopfschmerzen verursachen. Auf sichere Weise können Sie explizit angeben, was Sie verwenden, zusing Foo::Bar
.Angenommen, Sie haben Bar.cpp mit folgendem Inhalt:
Die Funktion funktionierte einwandfrei, bis sich eines Tages - scheinbar ohne Codeänderungen in relevanten Klassen - ihr Verhalten änderte: Plötzlich
currentIndex
scheint es immer um eins zu gehen . Wenn Sie die letzten Änderungen durchgehen, werden Sie feststellen, dass sich auch aus der Ferne keine Änderungen am Code ergeben.Schließlich entdecken Sie die Ursache:
Sie schließen (indirekt)
Foo.h
irgendwo ein. In den Dateien für den Foo-Namespace wurde eine neue Funktion hinzugefügt:Welches ist eine eindeutig bessere Übereinstimmung
increment(int)
als Ihre Funktionincrement(double)
- so wirdFoo::increment()
Funktion jetztBar::someFunction()
stattdessen von aufgerufen . Hoppla.(Und wenn Sie
using
in Überschriften schreiben würden ,using namespace Foo
die sich sehr gut irgendwo in Ihrem Include-Baum befinden könnten ...)So ... Do nicht schreibt jede
using
in Header und auch das Schreiben vorsichtig sein ,using namespace
in Quelldateien.quelle