it-swarm.com.de

Welchen Umfang hat die using-Deklaration in C ++?

Ich verwende die 'using'-Deklaration in C++, um std :: string und std :: vector zum lokalen Namespace hinzuzufügen (um unnötige' std :: 'einzugeben).

using std::string;
using std::vector;

class Foo { /*...*/ };

Welchen Geltungsbereich hat diese Erklärung? Wenn ich das in einem Header mache, wird es diese 'using'-Deklaration in jede cpp-Datei einfügen, die den Header enthält?

91
Jeff Lake

Wenn Sie eine Header-Datei in C++ einbinden, wird der gesamte Inhalt der Header-Datei an der Stelle abgelegt, an der Sie sie in die Quelldatei aufgenommen haben. Wenn Sie also eine Datei mit einer using -Deklaration einfügen, wird die using -Deklaration am Anfang jeder Datei platziert, die diese Header-Datei enthält.

55
Jeremy Ruten

Es gibt nichts Besonderes an Header-Dateien, das die using -Deklaration fernhalten würde. Es ist eine einfache Textsubstitution, bevor die Kompilierung überhaupt beginnt.

Sie können eine using -Deklaration auf einen Bereich beschränken:

void myFunction()
{
   using namespace std; // only applies to the function's scope
   vector<int> myVector;
}
105
Eclipse

Der Umfang der using-Anweisung hängt davon ab, wo sie sich im Code befindet:

  • An der Spitze einer Datei platziert, hat es Gültigkeitsbereich in dieser Datei.
  • Wenn es sich um eine Header-Datei handelt, hat sie in allen Dateien Gültigkeit, die diesen Header enthalten. Im Allgemeinen ist dies "keine gute Idee", da es unerwartete Nebenwirkungen haben kann
  • Andernfalls hat die sing -Anweisung den Gültigkeitsbereich innerhalb des Blocks, in dem sie enthalten ist, von dem Punkt an, an dem sie auftritt, bis zum Ende des Blocks. Wenn es in einer Methode platziert wird, hat es Gültigkeitsbereich innerhalb dieser Methode. Wenn es in eine Klassendefinition eingefügt wird, hat es Gültigkeitsbereich innerhalb dieser Klasse.
48
dagorym

Der Gültigkeitsbereich ist der Gültigkeitsbereich, in dem sich die using-Deklaration befindet.

Wenn es sich um einen globalen Bereich handelt, erfolgt dies im globalen Bereich. 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 lautet also: Vermeiden Sie die Verwendung von Deklarationen im globalen Bereich von Header-Dateien.

7
JohnMcG

Im genannten Fall die Datei ("Übersetzungseinheit"), das heißt 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.

6
James Curran

Das ist richtig. Der Gültigkeitsbereich ist das Modul, das die using -Deklaration verwendet. Wenn Header-Dateien, die ein Modul enthält, using -Deklarationen enthalten, gilt für diese Deklarationen dieses Modul sowie für alle anderen Module, die dieselben Header enthalten.

2
Ates Goral

Es gibt ein paar Kommentare, die eher unqualifiziert sind, wenn sie "Don't" sagen. Das ist zu streng, aber man muss verstehen, wann es in Ordnung ist.

Schreiben using std::string ist nie in Ordnung. Schreiben using ImplementationDetail::Foo in Ihrem eigenen Header, wenn dieser Header ImplementationDetail :: Foo als OK deklariert, außerdem, wenn die using-Deklaration in Ihrem Namespace auftritt. Z.B.

namespace MyNS {
    namespace ImplementationDetail {
        int Foo;
    }
    using ImplementationDetail::Foo;
}
0
MSalters