Frage

Wenn Sie C ++ - Namespaces verwenden, bevorzugen Sie sie explizit wie folgt:

std::cout << "Hello, world!\n";

Oder bevorzugen Sie? using namespace:

using namespace std;
cout << "Hello, world!\n";

Und wenn Sie letzteres bevorzugen, deklarieren Sie Ihre US -amerikanischen oder Funktionsbereiche?

Persönlich bevorzuge ich sie explizit - es ist mehr tippt, aber wenn ich eine Mischung von Namespaces verwende (z. B. std und boost) Ich finde es lesbarer.

War es hilfreich?

Lösung

Ich benutze immer using namespace Für STD & Boost. Alles andere benutze ich dazu, einen expliziten Namespace zu verwenden, es sei denn, er wird so sehr verwendet, dass er den Code überstößt.

In den Headern benutze ich nie using namespace Um den globalen Namespace der #Including -Quelle zu vermeiden.

Andere Tipps

Zusätzliches Tippen ist hier nicht das Problem. Das Problem mit explizit qualifizierten Namen ist die visuelle Unordnung. Seien wir ehrlich, C ++ Syntax ist unordentlich. Sie müssen dies nicht verschlimmern ::s.

Ich bin mit Jeff Atwood: Der beste Code ist überhaupt kein Code. Das ist so wahr.

Namespace -Importe sind eine großartige Möglichkeit, Unordnung ohne Nachteil zu reduzieren: Solange der Umfang der geöffneten Namespaces auf eine einzelne Kompilierungseinheit reduziert wird1, Name Konflikte, falls sie erscheinen, können leicht gelöst werden.

Warum explizite Namen (im Allgemeinen) lesbarer sein sollten, war mir immer ein Rätsel. Die Leser sollten den Code im Allgemeinen kennen, um Semantik abzuleiten. Wenn dies nicht der Fall ist, muss der Code sowieso behoben werden.


1) Folgerung: Nein using In den Kopfzeilen!

Ich benutze immer explizite. Das Schreiben von STD tut mir nicht weh und ich sehe deutlich, woher es kommt. Es ist nützlich, wenn Sie ein Legacy -Projekt haben, um das Sie sich mit seinen eigenen "Saiten", "Vektoren" usw. usw. kümmern müssen. Je mehr Informationen der Code mit sich trägt, desto besser.

Meine allgemeine Regel wird immer explizit den Namespace in den Headern verwenden und normalerweise die Verwendung im Code verwenden. Der Grund für erstere besteht darin, es in jedem Teil der Definition, was verwendet wird, ausdrücklich klar machen, und der Grund für letztere ist, dass es einfach macht, Ersatz aus einem anderen Namespace zu verwenden, wenn dies erforderlich wird. Wenn wir mit Foo :: String anstelle von std :: string beginnen, müssen wir nur den Header und die Verwendung von Anweisung verwenden, anstatt jede Instanz von std :: string durch Foo :: String im Code zu ersetzen.

Das ist natürlich weniger nützlich für Klassen, die sich im STD :: Namespace befinden, da Sie auch dann, wenn Sie eine Klasse ersetzen, immer noch andere in STD verwenden und möglicherweise auf Unklarheitenprobleme stoßen, aber das war nur ein Beispiel.

using und using namespace sind sehr sehr nützlich, um den Code lesbarer zu machen - Unordnung entfernen.

Aber auf jeden Fall, in dem es schwieriger wird, herauszufinden, woher ein Symbol kommt, lehne ich es ab, seinen ganzen Namespace zu importieren.

Ich versuche, den Umfang der importierten Namespaces zu leiten:

void bar() {

   // do stuff without vector

   { using std::vector;
      // do stuff with vector
   }

   // do stuff without vector
}

Für "allgemein bekannte" Bibliotheken wie std, Ich würde es wagen zu benutzen using namespace std. Es gibt Grund zu der Annahme, dass jeder, der diesen Code liest, diese Symbole kennt.

Als Nebenbetreuung, die using Das Schlüsselwort wird auch verwendet, um anzuzeigen, dass eine abgeleitete Klasse auch die überlasteten Mitglieder ihrer Superklasse exportiert.

class A {
  void f( A  );
  void f( bool );
};

class B : public A {
  using A::f; // without this, we get a compilation error in foo()
  void f(bool);
};

void foo() {
  B b;
  b.f( A() ); // here's a compilation error when no `using` is used in B
}

Ich verwende nur explizite Namespaces, wenn einige Unklarheiten vorhanden sind. Es ist lesbarer, aber das zusätzliche Tippen ist zu mühsam, und Sie müssen davon ausgehen, dass andere Entwickler mit Standardbibliotheken eine Grundliniengrad an Vertrautheit haben.

Die einzigen Zeiten, in denen ich einen Namespace buchstabiere, ist, wenn ich ihn nur ein- oder zweimal verwende, wie ein kurzes Debug-Erklärung oder wenn ich eine nicht standardmäßige Bibliothek verwende.

Normalerweise deklare ich den Namespace im Dateiumfang. Wenn Sie jedoch Namespaces mischen, könnte es sinnvoll sein, die Deklaration in den Funktionsumfang näher an den Punkt zu bringen, an dem sie verwendet wird.

using Im Funktionsbereich oder wenn die Funktion sehr klein ist (oft ist), nur explizite Namespace

Ich neige dazu, die Namen, die ich oben in der .cpp -Datei brauche, explizit importieren.

Verwenden von STD :: Cout; mit std :: endl;

etc...

Auf diese Weise habe ich die Kontrolle über die Namen, die ich verwende, und es ist leicht zu erkennen, woher sie kommen, und der Code wird am Gebrauchsort nicht überfüllt.

In den seltenen Fällen, in denen ich zwei Namen aus verschiedenen Namespaces verwende, qualifiziere ich sie zum Zweck der Verwendung vollständig.

Ich verwende immer voll qualifizierte Namen in Headers und verwende kaum jemals 'mit dem Namespace x' überall ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top