Ich stimme mit anderen überein, dass es zu Namenskonflikten und Unklarheiten kommen kann und dass es weniger eindeutig ist. Ich kann zwar die Verwendung von using
Ich persönlich ziehe es vor, sie zu begrenzen. Ich würde auch das in Betracht ziehen, worauf einige andere hingewiesen haben:
Wenn Sie einen Funktionsnamen suchen, der zwar recht häufig vorkommt, aber nur in der std
Namespace (oder umgekehrt - Sie wollen alle Aufrufe ändern, die no im Namensraum std
, Namensraum X
, ...), wie wollen Sie dann vorgehen?
Sie könnten ein Programm dafür schreiben, aber wäre es nicht besser, die Zeit damit zu verbringen, an Ihrem Projekt selbst zu arbeiten, anstatt ein Programm zu schreiben, das Ihr Projekt verwaltet?
Ich persönlich habe eigentlich nichts gegen die std::
Vorwahl. Ich mag das Aussehen mehr als das Fehlen eines Präfixes. Ich weiß nicht, ob das daran liegt, dass es explizit ist und mir sagt: "Das ist nicht mein Code... Ich verwende die Standardbibliothek", oder ob es etwas anderes ist, aber ich finde, es sieht schöner aus. Das mag seltsam sein, wenn man bedenkt, dass ich mich erst seit kurzem mit C++ beschäftige (ich benutze C und andere Sprachen schon viel länger und C ist meine Lieblingssprache aller Zeiten, gleich nach Assembler).
Es gibt noch eine weitere Sache, die allerdings etwas mit dem oben Gesagten und dem, was andere gesagt haben, zu tun hat. Auch wenn es vielleicht eine schlechte Praxis ist, behalte ich mir manchmal std::name
für die Version der Standardbibliothek und name für die programmspezifische Implementierung. Ja, das könnte Sie beißen und zwar heftig, aber es läuft alles darauf hinaus, dass ich dieses Projekt von Grund auf neu begonnen habe und ich der einzige Programmierer dafür bin. Beispiel: Ich überlade std::string
und nennen es string
. Ich habe hilfreiche Ergänzungen. Ich habe das zum Teil wegen meiner C- und Unix (+ Linux)-Tendenz zu klein geschriebenen Namen gemacht.
Außerdem können Sie Namespace-Aliase haben. Hier ist ein Beispiel dafür, wo dies nützlich ist, das vielleicht noch nicht erwähnt wurde. Ich verwende den C++11-Standard und zwar mit libstdc++. Nun, sie hat keine vollständige std::regex
unterstützen. Sicher, es kompiliert, aber es wirft eine Ausnahme nach dem Muster, dass es ein Fehler auf der Seite des Programmierers ist. Aber es ist ein Mangel an Implementierung.
Ich habe das Problem folgendermaßen gelöst. Installiere Boosts Regex und binde sie ein. Dann tue ich das folgende, so dass, wenn libstdc++ es vollständig implementiert hat, ich brauche nur diesen Block zu entfernen und der Code bleibt der gleiche:
namespace std
{
using boost::regex;
using boost::regex_error;
using boost::regex_replace;
using boost::regex_search;
using boost::regex_match;
using boost::smatch;
namespace regex_constants = boost::regex_constants;
}
Ich will nicht darüber streiten, ob das eine schlechte Idee ist oder nicht. Ich werde jedoch argumentieren, dass es sauber bleibt für meine Projekt und macht es gleichzeitig spezifisch: Stimmt, ich muss Boost verwenden, sondern Ich benutze es, wie die libstdc++ es schließlich haben wird. Ja, wenn man sein eigenes Projekt startet und mit einem Standard (...) ganz am Anfang beginnt, hilft das sehr bei der Wartung, Entwicklung und allem, was mit dem Projekt zu tun hat!
Nur um etwas klarzustellen: Ich halte es eigentlich nicht für eine gute Idee, den Namen einer Klasse/was auch immer in der STL absichtlich und konkret anstelle von. Der String ist die Ausnahme (ignorieren Sie das erste, obige oder zweite hier, Wortspiel, wenn es sein muss) für mich, da ich die Idee von "String" nicht mochte.
So wie es aussieht, bin ich immer noch sehr voreingenommen gegenüber C und voreingenommen gegenüber C++. Wenn man von Details absieht, passt vieles von dem, woran ich arbeite, eher zu C (aber es war eine gute Übung und ein guter Weg, um a. eine andere Sprache zu lernen und b. zu versuchen, weniger voreingenommen gegenüber Objekten/Klassen/etc. zu sein, was man vielleicht besser als weniger engstirnig, weniger arrogant und mehr akzeptierend bezeichnen könnte). Aber was ist nützlich ist, was einige bereits vorgeschlagen: Ich benutze in der Tat Liste (es ist ziemlich allgemein, nicht wahr?), und sortieren (dieselbe Sache), um zwei zu nennen, die einen Namenskonflikt verursachen würden, wenn ich tun würde using namespace std;
Deshalb ziehe ich es vor, spezifisch zu sein, die Kontrolle zu haben und zu wissen, dass ich es angeben muss, wenn ich es als Standard verwenden will. Einfach ausgedrückt: Annehmen ist nicht erlaubt.
Und um Boosts Regex zu einem Teil von std
. Ich tue das für die künftige Integration und - auch hier gebe ich zu, dass ich voreingenommen bin - ich denke nicht, dass es so hässlich ist wie boost::regex:: ...
. Das ist in der Tat eine andere Sache für mich. Es gibt viele Dinge in C++, die ich in Bezug auf Aussehen und Methoden noch immer nicht vollständig akzeptieren kann (ein weiteres Beispiel: variadische Vorlagen gegenüber var-Argumenten [obwohl ich zugeben muss, dass variadische Vorlagen sehr nützlich sind]). Selbst bei den Dingen, die ich akzeptiere, war es schwierig, und Ich habe immer noch Probleme mit ihnen.
710 Stimmen
Vergessen Sie nicht, was Sie tun können: "using std::cout;", was bedeutet, dass Sie nicht std::cout eingeben müssen, aber nicht gleichzeitig den gesamten std-Namensraum mit einbeziehen.
115 Stimmen
Es ist besonders schlecht, 'using namespace std' in Headerdateien im Dateisystem zu verwenden. Die Verwendung in Quelldateien (*.cpp) im Dateisystem nach allen Includes ist nicht ganz so schlimm, da ihre Wirkung auf eine einzige Übersetzungseinheit beschränkt ist. Noch weniger problematisch ist die Verwendung innerhalb von Funktionen oder Klassen, da die Wirkung auf den Funktions- oder Klassenbereich beschränkt ist.
15 Stimmen
Ich würde davon abraten, die using-Direktive zu verwenden, aber für bestimmte Namespaces wie
std::literals::chrono_literals
,Poco::Data:Keywords
,Poco::Units
und andere Dinge, die mit Literalen oder Lesbarkeitstricks zu tun haben. Immer dann, wenn es in Header- oder Implementierungsdateien steht. In einem Funktionsbereich mag es in Ordnung sein, aber abgesehen von Literalen und anderen Dingen ist es nicht nützlich.1 Stimmen
@sh- Warum meinen Sie, dass es "besonders schlecht" ist, "using namespace std" zu verwenden?
22 Stimmen
@Jon: Es hat nichts mit dem Namespace std im Besonderen zu tun. Meine Betonung lag auf "in Dateigröße in Header-Dateien". Um es als Ratschlag zu formulieren: Verwenden Sie "using namespace" (std oder andere) nicht im Dateisystem von Header-Dateien. Es ist OK, es in Implementierungsdateien zu verwenden. Entschuldigung für die Zweideutigkeit.
11 Stimmen
Es wird nur in Kopfzeilen als schlechte Praxis angesehen. In Quelldateien, die nicht anderweitig eingebunden sind (z. B. cpp-Dateien), ist es in Ordnung. Siehe @mattnewport 's Antwort unten. stackoverflow.com/a/26722134/125997
3 Stimmen
Ich habe den anderen keine Antwort hinzuzufügen, aber ich benutze:
using [namespace]::[identifier];
im lokalen Bereich von relativ einfachen Quelldateien. Wenn ich zum Beispiel einen Header habe, der häufig die voll qualifizierte:std::size_t
Typ, werde ich normalerweise vorangestellt:using std::size_t;
zur Umsetzung. Dies vereinfacht Lesen den Code und wirkt sich nur auf den lokalen Bereich aus - das heißt:using std::[identifier];
verwendet die Prinzip der geringsten Überraschung . Es gibt zu viele Bezeichner in derstd
Namespace, den man im Auge behalten muss. Spätere C++-Revisionen können Bezeichner hinzufügen, die mit Ihren eigenen kollidieren!0 Stimmen
Das macht Ihren Code einfacher.
0 Stimmen
>Warum ist das so? Weil die Leute in manchen Bereichen nichts wirklich zu tun haben und anfangen, über Dinge zu debattieren, die nicht wichtig sind. In der Sprache C++ können Sie jede Strategie verwenden, aber bitte verstehen Sie die using-directive und die using-declaration.