Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Using Namespace std = böse?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
10.09.2007, 22:34 Uhr
opiWahn



Ich benutze für meine konsolen anwendungen immer using namespace std, aber mir hat jetzt jemand gesagt, das wäre böse.
Warum und wieso soll dies so sein?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.09.2007, 23:05 Uhr
xXx
Devil


Ehm hast du evt. schon mal über den Sinn von namespaces in C++ nachgedacht? Vllt kommst du drauf. Nunja im Source selbst ist es aber trotzdem nicht unbedingt schlechter Stil ... es kommt drauf an. Nur im Header darf es NIEMALS stehen!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.09.2007, 23:07 Uhr
Kest
saint


Hi!

Das ist nicht böse, wenn man's richtig benutzt. >using namespace std< ist nur dann böse, wenn man etwas global definiert hat, was den gleichen Namen hat, wie ein Bezeichner im Namensbereich >std<: wenn man dann diesen Namen benutzen möchte, entsteht 'n Mehrdeutigkeitsfehler.

C++:
#include <iostream>

using namespace std;

struct A{ void put(char a){}; } cout;


int main()
{
    cout.put('2');    // std oder global ???
}

--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.

Dieser Post wurde am 10.09.2007 um 23:17 Uhr von Kest editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
11.09.2007, 10:13 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)



Zitat von xXx:
Ehm hast du evt. schon mal über den Sinn von namespaces in C++ nachgedacht? Vllt kommst du drauf. Nunja im Source selbst ist es aber trotzdem nicht unbedingt schlechter Stil ... es kommt drauf an. Nur im Header darf es NIEMALS stehen!

Das war ja eine sehr sinnvolle Antwort
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
11.09.2007, 16:15 Uhr
xXx
Devil


Tjo ... vllt ist dir ja der Sinn von namespaces bekannt... Auch wenn man den mit using namespace untergräbt, gehört es nicht zum schlechten Stil using namespace lokal zu nutzen ... wenn du using namespace aber im Header nutzt, wird der, der namespaces nutzt Probleme bekommen, wenn er den Header inkludiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
11.09.2007, 16:31 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Das hat nichts mit dem "Sinn von namespaces" oder dem Sinn des Lebens oder sonst einem Sinn zu tun sondern damit das der Threadersteller mit deiner Antwort nichts anfangen kann.

Also nächstes mal bitte sinnvoll Antworten (Bsp. Kests Post)

Dieser Post wurde am 11.09.2007 um 16:32 Uhr von Guybrush Threepwood editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
12.09.2007, 21:35 Uhr
~opiWahn
Gast


Danke für die Antworten, aber viel schlauer fühle ich mich jetzt auch nicht °.°
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
12.09.2007, 21:46 Uhr
öni



Also wenn du einfach using namespace std; am anfang von deinem Quellcode setzts um damit cout und cin und die anderen dinge zu nutzen dann ist das ok. Aber wenn du nun using namespace std; benutzt um neue Funktion zu definieren und dann noch die selben namen verwendest dann ist das schlechter stil so habe ich das nun rausinterpretiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
12.09.2007, 23:48 Uhr
Kest
saint


Also, allgemein nennt man >using namespace ...< eine Using-Direktive. Sie wird dazu verwendet, um die Namen in einem Namensbereich so verfügbar zu machen, als wären sie gar nicht in einem Namensbereich deklariert worden. Das hat aber zur Folge, dass es Mehrdeutigkeitsfehler entstehen, wenn man einen Namen benutzt, den es jetzt, nach dem >using namespace ...<, zwei mal gibt.

Wenn man also so was stehen hat:

C++:
namespace K {
     int a;
     int b;
}

int b;

using namespace K;

void foo(){
     b=12;
     }

wird >b< sowohl im globalen Namensbereich als auch in dem Namensbereich gesucht, der mit einer ><Using-Direktive< "geöffnet" wurde, in diesem Fall also dem >K<. Dieser Beispiel lässt sich nicht kompilieren, weil es >b< zwei mal gibt. So ist man gezwungen, dem Compiler zu helfen und genauer zu beschreiben, welches >b< man meint:

C++:
//...
void foo(){
    ::b=12;   // globales b
   K::b=12;  // b aus K
}


Mit einfachen Worten: wenn man weiß, was man tut, dann ist es ziemlich hilfreich. Ansonsten ist es vorzuziehen, so was nicht zu tun, weil, wenn es Fehler entstehen, man ehe auflösen muss.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.

Dieser Post wurde am 13.09.2007 um 00:00 Uhr von Kest editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
13.09.2007, 00:04 Uhr
0xdeadbeef
Gott
(Operator)


Über die Sinnhaftigkeit von using-Direktiven kann man lange und ziemlich ergebnislos streiten, und jeder hat dazu seine eigene Meinung.

Generell ist es zweifelhaft, using-Direktiven im globalen Kontext in Header-Dateien zu verwenden, weil man nie genau weiß, wo die Header nachher mal eingebunden werden - und damit erschöpft sich im Grunde auch der Konsens. Wogegen meines Erachtens nichts spricht, ist, sie im lokalen Kontext zu benutzen - das heißt

C++:
void foo() {
  using namespace std;

  cout << "foo" << endl;
}


Obwohl ich an der Stelle persönlich auch eher den namespace ausschreibe, oder, bei langen Namen Aliases definiere - zum Beispiel

C++:
void meine_kleine_parserfunktion() {
  namespace bs = boost::spirit;

  bs::parse(/* ... */);
}


Zankapfel ist bei sowas eher die Verwendung im globalen Kontext in Source-Dateien - es macht in der Praxis einige Dinge einfacher (halt weniger Tipparbeit), und andere komplizierter. Wenn man zum Beispiel Code hin- und herkopiert (und ja, mir ist bewusst, dass das nicht unter "best practice" läuft, aber in der Praxis kommt sowas gelegentlich schonmal vor), der dann doppeldeutige Symbole beinhaltet, kriegt man auf die Art schon mal unerwartete Fehler. Ich lass sowas generell sein, aber andere sehen das anders, und recht haben eigentlich beide - es ist halt Ansichtssache. Meine persönliche Motivation ist bei sowas halt, dass ich nachher beim Lesen des Codes sofort sehe, woher ein Symbol kommt - das hat mir auf lange Sicht meistens geholfen, Code, den ich nach Jahren noch mal anfassen musste, schneller wieder zu durchschauen.

Im Übrigen handelt es sich hierbei um eine Standard-C++-Frage, also
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 13.09.2007 um 00:08 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: