2016-12-13 5 views
0

Betrachten Sie dieseunter Verwendung von Standard-Namespace in C plus plus

#include<headerfile1> 
#include<headerfile2> 
. 
. 
#include<headerfilen> 
using namespace std; 

wenn ich dies schreibe (Header-Dateien alle in Standardbibliothek von C++), wird std-Namespace aller Header-Dateien kommen ins Bild?

Auch wenn es zwei Bibliotheken h1 und h2 gibt und beide denselben Namespace x haben und in diesen Namespaces dieselbe Funktion func() haben. Wie kann ich das beheben?

+0

ja, was kann es noch sein – artm

+7

Ersparen Sie sich die zukünftigen Kopfschmerzen und nie 'namespace std verwenden;' im Dateiumfang. – StoryTeller

+0

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 –

Antwort

0

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.