using namespace std VS using std::cin;...
-
groovemaster schrieb:
hagman schrieb:
grundsätzlich gilt: keine Namespaces in Headerdateien öffnen. Das ist böse.
Das hört man zwar immer wieder, so pauschal kann man das allerdings nicht sagen, imo. Wie "böse" das Öffnen von Namensräumen in Headerdateien ist, hängt davon ab, wie "public" diese ist.
Kannst Du das mal genauer erklären?
Wenn Du im Header nen NS aufbrichst und ich hab in meinem Projekt ne Funktion, die genauso heißt, dann zwingst Du mir ne Funktion auf, die ich nicht haben wollte. Also solltest Du das lassen. Immer. Grundsätzlich.
Oder meintest Du mit "public", daß der Code eben nur privat genutzt wird. In dem Falle kannst Du natürlich tun und lassen was Du willst. Ich muß Deinen Code dann ja nicht benutzen.
-
Jester schrieb:
Oder meintest Du mit "public", daß der Code eben nur privat genutzt wird. In dem Falle kannst Du natürlich tun und lassen was Du willst. Ich muß Deinen Code dann ja nicht benutzen.
Yep, so war das gemeint.
-
dann kann man auch sagen #define max(a,b) sei in ordnung, jenachdem wie "public" der code ist.... Aber das war eigentlich noch nie ein Kriterium.
-
Hallo,
ich finde es nicht nur böse, sondern auch unnötig. Schlechten Stil sollte man sich nicht angewöhnen.
-
DrGreenthumb schrieb:
dann kann man auch sagen #define max(a,b) sei in ordnung
Das ist ja wieder eine andere Baustelle. Inline Funktionen vs. function-like Makros? Da ist die Antwort in C++ relativ eindeutig. Und die Definition von Inline Funktionen im globalen Namensraum sehe ich ähnlich wie die using Direktive.
DrGreenthumb schrieb:
jenachdem wie "public" der code ist.... Aber das war eigentlich noch nie ein Kriterium.
Kriterium? Verrate mir doch mal, was bei folgenden Beispielen A und B technisch gesehen der Unterschied ist.
A
// internal.h using namespace foo; // form1.cpp #include "internal.h" // form2.cpp #include "internal.h"B
// form1.cpp using namespace foo; // form2.cpp using namespace foo;Ich sehe nirgendwo, dass A "böser" ist als B. Entweder sind beide "böse" oder keiner. Und mein Compiler bestätigt mich, denn der sagt mir, dass ÜE's A und ÜE's B identisch sind.
Oder plädierst du für die vollkommene Abschaffung der using Direktive?
-
und wie siehts aus wenn man NS in .cpp dateien öffnet?
-
Der Unterschied ist ganz einfach - im CPP-File weißt du, welche Bibliotheken du dort mit eingebunden hast. Also kannst du Namenskonflikte sauber eingrenzen. Den Header will eventuell jemand anderes einbinden, da weißt du nicht, ob das "using namespace std;" womöglich einen Konflikt zwischen std::find (du verwendest es nicht, dein "Kunde" benötigt es jedoch für einen anderen Teil des Programms mit dem von dir geschriebenen find() kollidiert).
-
CStoll schrieb:
Den Header will eventuell jemand anderes einbinden
Nein, will er nicht. Deshalb heisst der Header ja auch internal.h, wird nur in diesem Projekt verwendet und gelangt auch in keine anderen Hände. Jemand anderes soll sich gefälligst seine eigenen Header schreiben.
-
groovemaster schrieb:
Nein, will er nicht. Deshalb heisst der Header ja auch internal.h, wird nur in diesem Projekt verwendet und gelangt auch in keine anderen Hände. Jemand anderes soll sich gefälligst seine eigenen Header schreiben.
Wenn du die Definitionen nur an einer Stelle benötigst, warum brauchst du dann den Header? Header sind normalerweise dafür da, die Schnittstelle deiner Funktionsbibliothek für andere Programme festzulegen.
-
CStoll schrieb:
Wenn du die Definitionen nur an einer Stelle benötigst, warum brauchst du dann den Header?
Von welcher Definition sprichst du?
So ein Header kann zB dann sinnvoll sein, wenn du in vielen Quellcodedateien immer wieder einige Sachen brauchst, die mit 2-3 Zeilen nicht getan sind. Anderen mag es anders gehen, aber ich hab keine Lust, das jedesmal aufs Neue hinzuschreiben.CStoll schrieb:
Header sind normalerweise dafür da, die Schnittstelle deiner Funktionsbibliothek für andere Programme festzulegen.
Ne, das ist nur eine Anwendung davon. Header sind vor allem für weniger Schreibaufwand und Codekonsistenz sinnvoll. Theoretisch könnte man auch vollkommen ohne Header programmieren. Nur glaub ich nicht, dass irgendjemand Lust hat, sich jedesmal per Copy&Paste die benötigten Sachen in seine Quellcodedatei zu holen.
-
Für die lange using-Schleifen kann man sich auch etwas abhelfen ohne den ganzen NS zu öffnen. Ich hab in meinen Bibliotheken dafür nen extra NS, der so aussieht:
namespace UsingStdLibTypes { using Lib::foo; using Lib::bar; using Lib::blubb; using Lib::bla; }So kann der Benutzer einfach using namespace UsingStdLibTypes; schreiben und kann die Standardtypen die man an jeder Ecke braucht direkt verwenden und wenn es Probleme gibt, kann er sich immernoch direkt über den NS verwenden

-
DrGreenthumb schrieb:
jenachdem wie "public" der code ist.... Aber das war eigentlich noch nie ein Kriterium.
Kriterium?
wie Jester schon sagte, in deinem Code kannst du natürlich alle Schweinereien machen die du willst.
Oder plädierst du für die vollkommene Abschaffung der using Direktive?
nein