Re: #include <iostream> mit std-Namespace oder #include <iostream.h> ohne Namespaces besser?
Von: James Kanze (james.kanze@gmail.com) [Profil]
Datum: 23.06.2008 10:32
Message-ID: <a9c24184-1d1e-4bb8-8889-d8486e6a9d1e@8g2000hse.googlegroups.com>
Newsgroup: de.comp.lang.iso-c++
Datum: 23.06.2008 10:32
Message-ID: <a9c24184-1d1e-4bb8-8889-d8486e6a9d1e@8g2000hse.googlegroups.com>
Newsgroup: de.comp.lang.iso-c++
On Jun 22, 10:49 pm, Stefan Reuther <stefan.n...@arcor.de> wrote: > Lars Rohwedder wrote: > > Thomas Maeder <jvxexluzr...@mailinator.com> wrote: > >>[...] > >>Gemäss dem gegenwärtigen Standard musst Du auch <istream> (für > >>std::cin) und <ostream> (für std::cout) #includen, aber viele > >>C++-Implementationen #includen diese beiden Header mit <iostream> > >>gleich mit. > > [27.3] sagt etwas anderes. Dort werden in <iostream> die > > Standard-Ein- Ausgabestreams deklariert: > > ----<snip>---- > > namespace std { > > extern istream cin; > > extern ostream cout; > [...] > > } > > ----<snap>---- > > Dafür müssen natürlich die Datentypen (w)istream und (w)ostream > > definiert sein. > Natürlich nicht. Dazu reicht es, wenn diese Datentypen > _deklariert_ sind (salopp: "class istream;"). Na ja, ein bisschen komplizierter ist es wohl, weil istream keine Klasse ist, sondern ein typedef. Immerhin... > Damit würdest du > zwar Zugriff auf das Objekt 'cin' haben und könntest es z.B. > an eine Referenz binden, aber sonst nichts damit anstellen, > weil die Memberfunktionen fehlen. Das wäre nach dem aktuellen > Sprachstandard legal. > Aber wie James schon sagte, alle existierenden Bibliotheken > deklarieren die Typen nicht nur, sondern definieren sie > tatsächlich, so dass diese Diskussion rein akademisch ist, > eben weil der nächste Standard dieses existierende Verhalten > fordern wird. Historisch hat ISO die alte <iostream.h> verteilt, auf dem Grund, man wollte nicht alles einschleppen, nur weil man ostream braucht (also <ostream>), oder besonders in einem Header, nur weil man Referenzen auf istream und ostream verwendet (also <iosfwd>). Soweit so gut; bei <iostream> hat es immer zwei Betrachtungsweisen gegeben. Viele, wie ich, haben es im selben Sinn betrachtet, und etwas wie: #include <iosfwd> namespace std { extern istream cin ; // ... } erwartet; man includiert <iostream>, weil man std::cin oder std::cout braucht, und in der Praxis, in echten Andwendungsprogrammen kommt es selten vor, dass man std::cout und die << Operatoren in derselben Source brauchen. Andere aber (darunten Bjarne Stroustrup) haben es als direkten Ersatz für <iostream.h> betrachtet, und erwartet, dass es auch <istream>, <ostream> u.s.w. includiert. Mir wäre es eigentlich lieber gewesen, wenn die erste Interpretation sich durchgesetzt hätte. Dazu scheint es mir der eigentlichen Wörtern der Norm besser zu entsprechen. Es ist aber nicht so passiert---in der Tat haben alle Implementierungen die zweite Version implementiert, viele Bücher und Artikeln davon ausgegeben, u.s.w. Also habe ich dem Normierungsausschuss den Vorschlag gemacht, die Norm an die »existing practice« anzupassen. Vorschlag, der sofort angenehmen wurde. -- James Kanze (GABI Software) email:james.kanze@gmail.com Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34[ Auf dieses Posting antworten ]
