Hab ein fehler
-
Worum es aber geht ist, es schadet dir nicht using namespace std; in einer implementierungsdatei zu schreiben. es ist nicht der einzige weg, aber es ist auch nicht ein falscher weg.
wenn man gerne viel :: schreibt, kann man komplett ohne using auskommen. wenn man lieber weniger schreibt oder leichtes lesen bevorzugt wird man lieber zu usings verfallen.
problem ist halt bei der lesbarkeit dass std:: null information für den leser sind...
-
es gibt keine "gefahr" bei verwendung von using namespace. fehler, die der compiler nicht entdeckt stellen eine gefahr da. fehler, die der compiler immer findet und auch ausschmeisst sind keine gefahr. was sich nicht kompilieren lässt, kann auch nicht gefährlich sein

using declarations können unschön sein, weil sie u.u. mehrarbeit verursachen und es deshalb sinnvoll ist, sie sparsam einzusetzen. zumindest nicht in header-dateien.
-
Vor ner ganzen weile wurde hier in nem ähnlichen Thema von jemandem sehr gut begründet, dass using std::string unter umständen schlimmer sein kann, als using namespace std...aber ich erinner mich nicht mehr an die begründung

Vielleicht liest derjenige das nochmal und verweist auf den thread.
-
Shade Of Mine schrieb:
Du hast es nicht verstanden. Das Problem ist:
string s;
ist das jetzt xxx::string oder yyy::string?
ob ich hier using namespace xxx; oder using xxx::string; schreibe ist dabei vollkommen egal. sobald ich 2 gleiche sachen in einem projekt habe, habe ich ein problem. […]compiler fehler sind hierbei das geringste übel: viel größer sind die logischen probleme für den programmierer
Nicht unbedingt. Zufälligerweise habe ich vor kurzem an einem Projekt mitgearbeitet, wo genau dies der Fall ist. Die Bibliothek ist ein Toolsatz für Bioinformatiker, und hier braucht man nunmal unterschiedliche Stringtypen. Unter anderem hat die Bibliothek eben auch eine Klasse libname::string<> definiert ('std::basic_string' wäre hier übrigens keine Alternative gewesen). Und schon hast Du Deinen Konflikt.
-
otze schrieb:
Vor ner ganzen weile wurde hier in nem ähnlichen Thema von jemandem sehr gut begründet, dass using std::string unter umständen schlimmer sein kann, als using namespace std...aber ich erinner mich nicht mehr an die begründung

Die ausführliche Begründung findest du in Sutters "More Exceptional C++" und das Ganze stimmt für usings in Headern. Ganz kurz: was eine using-Deklaration bedeutet hängt vom Kontext ab, in dem sie steht. Da es sich um eine (weitere) Deklaration handelt, werden nur solche Namen berücksichtigt, die bereits deklariert sind. Da Namespaces nun aber offen und gerne mal über mehrere Header verteilt sind, ist die genaue Bedeutung einer using-Deklaration in einem Header von der Reihenfolge abhängig, in der verschiedene Header am Ende inkludiert werden. Das ist nicht nur unangenehm, es kann auch schnell zu einer Verletzung der ODR (gerne mal bei inline-Funktionen) und damit zu undefiniertem Verhalten führen.
Eine using-Direktive hingegen, ist nicht ganz so dramatisch, da sie alle Namen verfügbar macht. Unabhängig davon ob selbige vor oder nach der using-Direktive deklariert werden. In diesem Punkt ist eine using-Direktive also Reihenfolgeunabhängig.
Trotzdem gehören sie nicht in Header (oder vor irgendwelche includes): Zum einen ist es unhöflich jedem alle Namen eines Namespaces aufzuzweingen und zum anderen kann es die Bedeutung von anderen Headern ändern, die ohne using im Hinterkopf geschrieben wurden.
-
Shade Of Mine schrieb:
problem ist halt bei der lesbarkeit dass std:: null information für den leser sind...
Wenn ich lese std::string, dann ist 100% und ohne Zweifel klar, was das ist. Bei "string" ist das weniger klar. Außerdem sind ellenlange using-Leisten unschön. (Und die entstehen selbst wenn man "using namespace" benutzt unter Umständen.)
Das Beispiel mit std::string und gott::string war übrigens nicht aus der Luft gegriffen. Aber jetzt ist GOTT ja eh mehr oder weniger "beendet".
