Ich verwende die 'using'-Deklaration in C ++, um dem lokalen Namespace std :: string und std :: vector hinzuzufügen (um unnötige' std :: 's einzugeben).
using std::string;
using std::vector;
class Foo { /*...*/ };
Was ist der Umfang dieser Erklärung? Wenn ich dies in einem Header mache, werden diese 'using'-Deklarationen in jede cpp-Datei eingefügt, die den Header enthält?
using
Deklaration (oderusing
Direktive) in den Dateibereich einer Include-Datei / eines Include-Headers ein! Dies bereitet den Benutzern des Headers Kopfschmerzen.using
Erklärung (erst recht Richtlinie ) in einem Header überhaupt , sogar innerhalb eines Namespace! Informationen zu den dadurch verursachten Problemen finden Sie im Anwendungsbereich der Deklaration in einem Namespace .using
im Klassen- und Funktionsumfang ist in Bezug auf das besprochene Problem sicher.Antworten:
Wenn Sie eine Header-Datei in C ++ einschließen, wird der gesamte Inhalt der Header-Datei an der Stelle platziert, an der Sie sie in die Quelldatei aufgenommen haben. Das Einfügen einer Datei mit einer
using
Deklaration hat also genau den gleichen Effekt,using
wenn die Deklaration oben in jeder Datei platziert wird, die diese Header-Datei enthält.quelle
using
Deklaration jedoch in anamespace
einfügen, ist sie auf den Umfang dieses Namespace beschränkt und daher im Allgemeinen in Ordnung (mit den üblichen Einschränkungen für Ihre speziellen Anforderungen und Ihren Stil).Es gibt nichts Besonderes an Header-Dateien, das die
using
Deklaration fernhalten würde . Es ist eine einfache Textersetzung, bevor die Kompilierung überhaupt beginnt.Sie können eine
using
Deklaration auf einen Bereich beschränken:quelle
using
innerhalb einer Funktion (oder sogar eines gtest-TEST
Makros!) Macht mein Leben so viel besser!Der Umfang der using-Anweisung hängt davon ab, wo sie sich im Code befindet:
quelle
using
Anweisung innerhalb des Klassenbereichs hinzuzufügen ...? Aus diesem Grund hatte ich die gleiche Frage wie das OP, da ich vermeiden wollte,std::
überall zu tippen . Ich habe Klassen, die viele Vektoren mit intelligenten Zeigern verwenden, und dasstd::
Präfix mit fünf Zeichen fügt viel Zeilenlänge hinzu - was ich als schlechter empfinde. Ich habe mich also gefragt, ob eineusing
Direktive im Namespace, die die Klasse enthält, in Ordnung ist. (Auch wenn innerhalb eines Headers.)namespace { ... }
?Der Gültigkeitsbereich ist der Gültigkeitsbereich, in dem sich die using-Deklaration befindet.
Wenn dies ein globaler Bereich ist, liegt dieser im globalen Bereich vor. Wenn es sich im globalen Bereich einer Header-Datei befindet, befindet es sich im globalen Bereich jeder Quelldatei, die den Header enthält.
Der allgemeine Rat ist daher, die Verwendung von Deklarationen im globalen Bereich von Header-Dateien zu vermeiden .
quelle
Im genannten Fall die Datei ("Übersetzungseinheit"), dh ja, jede Datei, die sie enthält.
Sie können die using-Anweisung auch in die Klasse einfügen. In diesem Fall gilt sie nur für diese Klasse.
Wenn Sie einen Namespace in einem Header angeben müssen, ist es im Allgemeinen oft am besten, alle erforderlichen Bezeichner vollständig zu qualifizieren.
quelle
using
Deklaration in einer Klasse nicht wie außerhalb einer Klasse verhält - z. B. können Sie sie nicht verwenden,cout
anstattstd::cout
in den Bereich der Klasse zu bringen.Das ist richtig. Der Bereich ist das Modul, das die
using
Deklaration verwendet. Wenn Header-Dateien, die ein Modul enthält,using
Deklarationen enthalten, ist der Umfang dieser Deklarationen dieses Modul sowie alle anderen Module, die dieselben Header enthalten.quelle
Es gibt einige Kommentare, die eher unqualifiziert sind, wenn sie "Nicht" sagen. Das ist zu streng, aber man muss verstehen, wann es in Ordnung ist.
Schreiben
using std::string
ist niemals in Ordnung. Wenn Sieusing ImplementationDetail::Foo
in Ihren eigenen Header schreiben und dieser Header deklariert, kann ImplementationDetail :: Foo in Ordnung sein, auch wenn die using-Deklaration in Ihrem Namespace erfolgt. Z.Bquelle
MyNS::Foo
using boost::posix_time::ptime
. Sicher, der Benutzer könnte schreiben,MyNS::ptime
aber das ist nicht das Ende der Welt und könnte durch die Bequemlichkeit ausgeglichen werden, Funktionen wie zu habenMyFunction(ptime a, ptime b)
.using std::string
nie in Ordnung? Auch in Ihrem eigenen Namespace, um vielestd::
Präfixe zu speichern ?