Ich stimme mit den anderen hier überein, aber ich möchte die Bedenken bezüglich der Lesbarkeit ansprechen - Sie können all das vermeiden, indem Sie einfach Typendefinitionen am Anfang Ihrer Datei, Funktion oder Klassendeklaration verwenden.
Ich verwende sie in der Regel in meiner Klassendeklaration, da die Methoden einer Klasse in der Regel mit ähnlichen Datentypen (den Mitgliedern) arbeiten und ein Typedef die Möglichkeit bietet, einen Namen zu vergeben, der im Zusammenhang mit der Klasse sinnvoll ist. Dies erleichtert die Lesbarkeit der Definitionen der Klassenmethoden.
// Header
class File
{
typedef std::vector<std::string> Lines;
Lines ReadLines();
}
und bei der Umsetzung:
// .cpp
Lines File::ReadLines()
{
Lines lines;
// Get them...
return lines;
}
im Gegensatz zu:
// .cpp
vector<string> File::ReadLines()
{
vector<string> lines;
// Get them...
return lines;
}
oder:
// .cpp
std::vector<std::string> File::ReadLines()
{
std::vector<std::string> lines;
// Get them...
return lines;
}
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.