 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Thomas Maeder Guest
|
Posted: Wed Mar 09, 2005 3:48 pm Post subject: Re: "endl" überschreiben? |
|
|
Mark Henning <mh (AT) homolog (DOT) de> writes:
| Quote: | Ich würde gerne "endl" überschreiben, bzw. von ofstream eine Klasse
ableiten, bei der "endl" modifiziert ausgeführt wird. Die
Implementation setzt da aber anscheinend einige Grenzen, so einfach
mit Überladen ist nicht. Wie mache ich das also am besten?
|
Gar nicht.
Was ist das eigentliche Problem, das Du lösen willst?
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Falk Tannhäuser Guest
|
Posted: Wed Mar 09, 2005 3:59 pm Post subject: Re: "endl" überschreiben? |
|
|
Mark Henning wrote:
| Quote: | Ich würde gerne "endl" überschreiben, bzw. von ofstream eine Klasse
ableiten, bei der "endl" modifiziert ausgeführt wird. Die
Implementation setzt da aber anscheinend einige Grenzen, so einfach
mit Überladen ist nicht. Wie mache ich das also am besten?
|
Da std::endl keine virtuelle Member-Funktion ist, sondern als
freie Funktion
std::ostream& endl(std::ostream&);
(genauer: als
template <class charT, class traits>
basic_ostream<charT, traits>& endl(basic_ostream<charT, traits>&);
daher tut's auch mit std::wostream
)
deklariert ist, lässt es sich nicht überschreiben.
Einfaches Überladen scheitert daran, dass mit
MeinAbgeleiteterOStream& endl(MeinAbgeleiteterStream& os)
{
MachWasBesonderes(os);
os << std::endl;
return os;
}
....
MeinAbgeleiteterOStream mein_os;
using std::endl;
beispielsweise der Ausdruck
os << 42 << endl
als
(os << 42) << endl
interpretiert wird und der Teilausdruck 'os << 42' den Aufruf von
std::ostream& std::ostream::operator<<(int)
nach sich zieht und daher zwar den dynamischen Typ 'MeinAbgeleiteterOStream'
hat, doch den statischen Typ 'std::ostream&' - demzufolge wird std::endl
aufgerufen und nicht deine überladene Version.
Was ginge, wäre z.B. in etwa
namespace MeinZeuch
{
class MeinAbgeleiteterOStream : public std::ofstream { ... };
std::ostream& endl(std::ostream& os)
{
os << std::endl; // ggf. erst zum Schluss aufrufen?
if(MeinAbgeleiteterOStream* pos = dynamic_cast
MachWasBesonderes(*pos);
//os << std::endl; // siehe oben
return os;
}
} // namespace MeinZeuch
Dabei müsste man sicherstellen, dass an den gewünschten Stellen MeinZeuch::endl
aufgerufen wird und nicht std::endl (daher kein 'using std::endl'!)
MfG
Falk
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Markus Schaaf Guest
|
Posted: Wed Mar 09, 2005 4:09 pm Post subject: Re: "endl" überschreiben? |
|
|
"Mark Henning" <mh (AT) homolog (DOT) de> schrieb:
| Quote: | Ich würde gerne "endl" überschreiben, bzw. von ofstream eine Klasse
ableiten, bei der "endl" modifiziert ausgeführt wird. Die
Implementation setzt da aber anscheinend einige Grenzen, so einfach
mit Überladen ist nicht. Wie mache ich das also am besten?
|
#include <ostream>
namespace my
{
template< typename C, class T >
std::basic_ostream<C,T>& endl( std::basic_ostream<C,T>& os )
{
return os << ";n" << std::flush;
}
}
#include
int main()
{
using std::cout;
{
using std::endl;
cout << "foo" << endl;
}
{
using my::endl;
cout << "bar" << endl;
}
return !cout;
}
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Thomas Maeder Guest
|
Posted: Wed Mar 09, 2005 5:43 pm Post subject: Re: "endl" überschreiben? |
|
|
Mark Henning <mh (AT) homolog (DOT) de> writes:
| Quote: | Die LogFile-Klasse wird über ein Makro angesprochen, das im Prinzip so
aussieht:
#define WriteLog(a)
{
ostream * postr = MyGlobalLogFile.Open()
postr << MyGlobalLogFile.CurrentIndent() << a << endl;
postr->close();
}
|
Kannst Du nicht einfach etwas anders als std::endl (ist das
std::endl?) ausgeben hier?
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Falk Tannhäuser Guest
|
Posted: Wed Mar 09, 2005 6:53 pm Post subject: Re: "endl" überschreiben? |
|
|
Mark Henning wrote:
| Quote: | Ich habe eine LogFile-Klasse, die je nach Programm-Abschnitt die Daten
unterschiedlich eingerückt ausgibt. Nun will ich aber nicht für jedes
Objekt eine eigene Ausgabefunktion nur für die LogFile-Klasse
schreiben. Und manche Objekte (z.B. Matrizen) geben die Daten über
mehrere Zeilen verteilt aus.
Was ich im Moment habe, ist z.B. bei einer Matrix-Ausgabe das hier:
a11 a12 a13
a21 a22 a23
a31 a32 a33
Was ich will, ist aber, dass es so aussieht:
a11 a12 a13
a21 a22 a23
a31 a32 a33
Die LogFile-Klasse wird über ein Makro angesprochen, das im Prinzip so
aussieht:
#define WriteLog(a)
{
ostream * postr = MyGlobalLogFile.Open()
postr << MyGlobalLogFile.CurrentIndent() << a << endl;
postr->close();
}
Das funktioniert aber nur, solange der Text in a einzeilig ist. Bei
mehrzeiliger Ausgabe geht es schief.
|
Also du hast z.B.
char const msg[] = "a11 a12 a13na21 a22 a23n"
"a31 a32 a33";
und willst, dass mit 'WriteLog(msg);' alles richtig eingerückt wird?
Hätt'ste 's gleich so gesagt... In diesem Falle bringt dich das
Umschreiben von 'endl' nicht weiter - was du willst, ist, jegliches
Auftreten von 'n' zu erkennen, um danach dann die richtige Einrückung
vornehmen zu können. Dies kann mit einem speziellen 'filtering streambuf'
erreicht werden:
________________________________________________________________________
#include <iostream>
#include <ostream>
#include <cassert>
class indenting_streambuf : public std::streambuf
{
unsigned ilevel;
bool need_indent;
std::streambuf& sb;
public:
indenting_streambuf(std::streambuf& s)
: ilevel(0),
need_indent(true),
sb(s)
{
// No buffering
}
void indent_level(unsigned n) { ilevel = n; }
void inc_indent_level(unsigned n = 1) { ilevel += n; }
void dec_indent_level(unsigned n = 1) { assert(ilevel>=n); ilevel -= n; }
protected:
virtual int_type overflow(int_type c);
}; // class indenting_streambuf
indenting_streambuf::int_type indenting_streambuf::overflow(indenting_streambuf::int_type c)
{
if(need_indent)
for(unsigned i=0; i
sb.sputc(' ');
need_indent = c == 'n';
return sb.sputc(c);
} // indenting_streambuf::overflow
// Hilfsklasse: Der Konstruktor hängt einen 'indenting_streambuf' zwischen einen
// existierenden std::ostream und dessen zugehörigen std::streambuf. Der Destruktor
// biegt alles wieder hin wie's war.
class stream_indenter
{
std::ostream& os;
indenting_streambuf isb;
std::streambuf* old_sb;
stream_indenter(stream_indenter const&); // copy constructor not implemented
public:
stream_indenter(std::ostream& o)
: os(o),
isb(*o.rdbuf()),
old_sb(o.rdbuf(&isb))
{}
~stream_indenter()
{
os.rdbuf(old_sb);
}
void indent_level(unsigned n) { isb.indent_level(n); }
void inc_indent_level(unsigned n = 1) { isb.inc_indent_level(n); }
void dec_indent_level(unsigned n = 1) { isb.dec_indent_level(n); }
}; // class stream_indenter
________________________________________________________________________
Damit geht dann z.B.
stream_indenter indent_cout(std::cout);
indent_cout.inc_indent_level(4);
std::cout << "Hello,nworld!n" << 42 << 'n' << 1.95583 << std::endl;
bzw.
std::ofstream LogFile("log.txt");
stream_indenter indent_log(LogFile);
...
Hoffentlich hab' ich jetzt richtig kapiert, was du wolltest...
MfG
Falk
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Sebastian Waschik Guest
|
Posted: Mon Mar 14, 2005 4:40 pm Post subject: Re: Header-Dateien ohne .h? (Re: "endl"überschreiben?) |
|
|
Hallo,
Mark Henning <mh (AT) homolog (DOT) de> writes:
| Quote: | BTW: Ich habe dabei gesehen, dass es anscheinend von einigen
Header-Dateien mehrere Versionen gibt (einmal mit ".h", einmal ohne).
Was hat es damit auf sich?
|
In BS ISO/IEC 14882:2003 (Second Edition), dem C++ Standard, steht im
Anhang D ("Compatibility features"):
For compatitbility with the Standard C libary, the C++ Standard
library provides the 18 C headers, as shown in Table 100:
[...]
Every C header, each of which has a name of the form name.h,
behaves af if each name placed in the Standard libary namespace by
the corresponding cname header is also place within the namespace
scope of the namespace std and is followed by an explicit
using-declaration (7.3.3).
Mit anderen Worten: Diese .h-Header werden für die Kompatiblität mit C
zur Verfügung gestellt. Da C keinen Namensräume zur Verfügung stellt,
werden die Funktionen bei der .h-Variante in den globalen Namensraum
zur Verfügung gestellt (also std:: ist nicht notwendig). Statt
<name.h> wird aber <cname> empfohlen (std:: notwendig).
Die Auflistung der "C++ Library Headers" enthält kein Header die
Endung ".h". Dies ist AFAIK so, damit mit nicht versehentlich mit
irgendwelchen C-Headern in Konflikt geraden könnte.
HTH
Viele Grüße
Sebastian Waschik
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Falk Tannhäuser Guest
|
Posted: Mon Mar 14, 2005 4:51 pm Post subject: Re: Header-Dateien ohne .h? (Re: "endl" überschreiben?) |
|
|
Mark Henning wrote:
| Quote: | BTW: Ich habe dabei gesehen, dass es anscheinend von einigen
Header-Dateien mehrere Versionen gibt (einmal mit ".h", einmal ohne).
Was hat es damit auf sich?
|
Manche der Header mit dem Namen ???.h sind C-kompatible Versionen der
Standard-C++-Header mit Namen c???, in welchen die darin deklarierten
Bezeichner im globalen Namensraum stehen anstatt in namespace std -
z.B. entspricht stdio.h cstdio, string.h cstring usw.
Außerdem gab es bereits vor der Standardisierung von C++ iostream-
Implementierungen, welche in Headern namens beispielsweise iostream.h,
streambuf.h usw. standen. Diese Header sind aus Kompatibilitätsgründen
häufig auch noch bei neueren Compilern dabei, jedoch ist ihr Inhalt
nicht vom Standard definiert und sie sollten für Neuentwicklungen
nicht mehr benutzt werden.
MfG
Falk
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Mon Mar 14, 2005 5:01 pm Post subject: Re: Header-Dateien ohne.h? (Re: "endl"überschreiben?) |
|
|
Mark Henning wrote:
| Quote: |
Mark Henning (Wed, 09 Mar 2005 20:27:12 +0100) wrote:
Hoffentlich hab' ich jetzt richtig kapiert, was du wolltest...
Heute Abend is' schon spät, werde morgen einen Blick draufwerfen.
Danke jedenfalls.
Mittlerweile habe ich Deinen Vorschlag implementiert, und es
funktioniert. Danke.
BTW: Ich habe dabei gesehen, dass es anscheinend von einigen
Header-Dateien mehrere Versionen gibt (einmal mit ".h", einmal ohne).
Was hat es damit auf sich?
|
Alle C++ Standard Header besitzen *kein* .h
Die solltest Du immer nehmen.
Nun ist es aber so, dass C++ - Compiler existierten, *bevor* es
eine C++ Sprachnorm gab. In Ermangelung von Vorschriften haben die
meisten Compiler Hersteller es so gehalten, dass deren Header Dateien
*mit* einem .h ausgeliefert wurden. Dann kam der C++ - Standard und
das .h musste verschwinden.
Tja. Wenn das so einfach waere. Den in der Zwischenzeit wurde natuerlich
eine Menge Code produziert, der natuerlich die alten .h Header benutzte.
Und da es sich kein Compiler-Hersteller mit einem Entwickler verscherzen
wollte, liefern die meisten Hersteller auch heute noch 2 Versionen der
Header aus: einmal mit .h, einmal ohne .h
Verkompliziert wurde das Ganze noch dadurch, dass sich die Semantik der
Header ein kleines bischen unterscheidet. Waehrend die meisten .h Header
ihr Zeugs ganz einfach in den globalen Namespace stecken, verlangt der C++
Standard von seinen Headern, dass alles im Namespace 'std' definiert wird.
Aber wie gesagt: Offiziell gibt es keine Stadard - .h Header.
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
dietmar_kuehl@yahoo.com Guest
|
Posted: Mon Mar 14, 2005 5:53 pm Post subject: Re: Header-Dateien ohne.h? (Re: "endl" überschreiben?) |
|
|
Karl Heinz Buchegger wrote:
| Quote: | Alle C++ Standard Header besitzen *kein* .h
Die solltest Du immer nehmen.
|
??? Was ist mit den C Standard Headern, die im Annex D
(depr.c.headers) definiert werden? Ich dachte immer, die sind
Teil des C++ Standards!
.... und nicht nur das: wenn man portablen Code schreiben möchte,
dann empfiehlt es sich sogar, diese Header zu verwenden, da es
praktisch keine Implementierung der C++ Standardbibliothek gibt,
die die entsprechenden Header-Versionen ohne .h so implementiert,
wie es im Standard vorgesehen ist: aus ganz technischen Gründen
werden die Symbole aus der C Standardbibliothek praktisch nie im
Namespace 'std' definiert, sondern immer im globalen Namespace.
Der Namespace 'std' enthält dann using-Deklarationen für global
Namen. Die Konsequenz ist, dass man nicht merkt, wenn
versehentlich ein C Name ohne entsprechende Namespace-Behandlung
(Qualifizierung, using-Deklaration oder using-Direktive) verwendet
wird. Damit ist die Gefahr relativ groß, das der Code ausgerechnet
auf einer streng konformation Implementierung nicht funktioniert!
| Quote: | Aber wie gesagt: Offiziell gibt es keine Stadard - .h Header.
|
.... außer denen für die C Standardbibliothek.
--
<mailto:dietmar_kuehl (AT) yahoo (DOT) com> <http://www.dietmar-kuehl.de/>
<http://www.contendix.com> - Software Development & Consulting
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Michael Etscheid Guest
|
Posted: Mon Mar 14, 2005 7:20 pm Post subject: Re: Header-Dateien ohne.h? (Re: "endl" überschreiben?) |
|
|
[email]dietmar_kuehl (AT) yahoo (DOT) com[/email] schrieb:
| Quote: | .... und nicht nur das: wenn man portablen Code schreiben möchte,
dann empfiehlt es sich sogar, diese Header zu verwenden
|
Nein, die Header sind deprecated! Außerdem gibt es teilweise wichtige
Unterschiede zwischen den Headern. Es empfiehlt sich auf jeden Fall die
neuen Header zu verwenden.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
dietmar_kuehl@yahoo.com Guest
|
Posted: Tue Mar 15, 2005 7:44 am Post subject: Re: Header-Dateien ohne.h? (Re: "endl" überschr eiben?) |
|
|
Michael Etscheid wrote:
| Quote: | dietmar_kuehl (AT) yahoo (DOT) com schrieb:
.... und nicht nur das: wenn man portablen Code schreiben möchte,
dann empfiehlt es sich sogar, diese Header zu verwenden
Nein, die Header sind deprecated!
|
Mir ist durchaus bekannt, dass sie "deprecated" sind. Das ändert aber
nichts an der Tatsache, dass Code, der die neuen Header verwendet eine
faire Chance hat, nicht auf allen konformen Implementierungen zu
funktionieren, da irgendwo eine Namespace-Qualifizierung vergessen
wurde.
| Quote: | Außerdem gibt es teilweise wichtige Unterschiede zwischen den
Headern. |
Es gibt genau einen Unterschied: die Namen der C Standard Bibliothek
sind nicht nur im Namespace 'std' verfügbar, sondern auch im globalen
Namespace. In der Tat bedeutet das, dass es in typischen
Implementierungen
grade keinen Unterschied zwischen den Headern gibt, es sehr wohl aber
in
einer strikten Implementierung einen Unterschied geben kann. Genau das
ist
die Quelle von Fehlern. Der garantierte Inhalt der .h-Version ist
präzise
definiert (alle Namen sind sowohl im globalen Namespace als auch im
Namespace 'std' verfügbar). Der Inhalt der neuen Header Version ist
dagegen nicht so klar definiert: die Namen sind sicher im Namespace
'std'
definiert, in typischen Implementierungen aber auch im globalen
Namespace.
Das heißt, der wesentliche Unterschied ist, dass klar ist was in den
..h-Version enthalten ist.
| Quote: | Es empfiehlt sich auf jeden Fall die neuen Header zu verwenden.
|
Warum? Nur weil die Header "deprecated" sind? Ich halte technische
Gründe
für wichtiger, insbesondere da die .h-Versionen nicht so bald aus dem
Standard verschwinden werden. Es ist wahrscheinlicher, dass die
Deprecation der .h-Header aufgehoben wird, als dass sie entfernt
werden:
es wird als gescheitertes Experiment angesehen, die Namen der C
Standardbibliothek im Namespace 'std' definieren zu wollen. Das würde
nur
gehen, wenn die C Standardbibliothek von den C++ Entwicklern kommt, was
auf vielen Plattformen unpraktikabel ist.
Ich bleibe bei meiner Empfehlung: für die C Standardbibliohtek sollten
die
..h-Header verwendet werden - obwohl sie deprecated sind!
--
<mailto:dietmar_kuehl (AT) yahoo (DOT) com> <http://www.dietmar-kuehl.de/>
<http://www.contendix.com> - Software Development & Consulting
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Karl Heinz Buchegger Guest
|
Posted: Tue Mar 15, 2005 9:49 am Post subject: Re: Header-Dateien ohne.h? (Re: "endl"überschreiben?) |
|
|
"dietmar_kuehl (AT) yahoo (DOT) com" wrote:
| Quote: |
Karl Heinz Buchegger wrote:
Alle C++ Standard Header besitzen *kein* .h
Die solltest Du immer nehmen.
??? Was ist mit den C Standard Headern, die im Annex D
(depr.c.headers) definiert werden? Ich dachte immer, die sind
Teil des C++ Standards!
|
Erwischt. And die hatte ich nicht mehr gedacht.
--
Karl Heinz Buchegger
[email]kbuchegg (AT) gascad (DOT) at[/email]
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Rolf Magnus Guest
|
Posted: Tue Mar 15, 2005 1:17 pm Post subject: Re: Header-Dateien ohne.h? (Re: "endl" überschr eiben?) |
|
|
Mark Henning wrote:
| Quote: | dietmar_kuehl (AT) yahoo (DOT) com (14 Mar 2005 23:44:46 -0800) wrote:
Michael Etscheid wrote:
Außerdem gibt es teilweise wichtige Unterschiede zwischen den
Headern.
Es gibt genau einen Unterschied: die Namen der C Standard Bibliothek
sind nicht nur im Namespace 'std' verfügbar, sondern auch im globalen
Namespace.
Das stimmt so anscheinend nicht. Ich bin darauf gekommen, weil ich in
Falk Tannhäusers Beispiel das fehlende ".h" zunächst für eine
Tippfehler gehalten habe.
In <ostream.h> gibt es bei ostream z.B. keine Funktion rdbuf(streambuf
*). Aber in <ostream> gibt es sie.
|
Das ist kein C-Header, sondern ein veralteter C++-Header. Der ist in der
Norm nicht nur deprecated, sondern existiert dort gar nicht erst.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Christoph Rabel Guest
|
Posted: Tue Mar 15, 2005 1:18 pm Post subject: Re: Header-Dateien ohne.h? (Re: "endl" überschr eiben?) |
|
|
Mark Henning wrote:
| Quote: | dietmar_kuehl (AT) yahoo (DOT) com (14 Mar 2005 23:44:46 -0800) wrote:
Es gibt genau einen Unterschied: die Namen der C Standard Bibliothek
sind nicht nur im Namespace 'std' verfügbar, sondern auch im globalen
Namespace.
Das stimmt so anscheinend nicht. Ich bin darauf gekommen, weil ich in
Falk Tannhäusers Beispiel das fehlende ".h" zunächst für eine
Tippfehler gehalten habe.
In <ostream.h> gibt es bei ostream z.B. keine Funktion rdbuf(streambuf
*). Aber in <ostream> gibt es sie.
|
Das Thema sind die C Header (z.B. stdio.h), nicht die alten C++ Header.
Das man ostream.h nicht mehr benutzen darf, ist klar.
mfg
Christoph
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
dietmar_kuehl@yahoo.com Guest
|
Posted: Tue Mar 15, 2005 1:37 pm Post subject: Re: Header-Dateien ohne .h? (Re: "endl" übe rschr eiben?) |
|
|
Mark Henning wrote:
| Quote: | dietmar_kuehl (AT) yahoo (DOT) com (14 Mar 2005 23:44:46 -0800) wrote:
Es gibt genau einen Unterschied: die Namen der C Standard Bibliothek
sind nicht nur im Namespace 'std' verfügbar, sondern auch im
globalen
Namespace.
Das stimmt so anscheinend nicht.
|
Das stimmt exakt genau so! Siehe depr.c.header im Standard.
| Quote: | In <ostream.h> gibt es bei ostream z.B. keine Funktion
rdbuf(streambuf
*). Aber in <ostream> gibt es sie.
|
Bitte beachte den Kontext: ich habe von den Headern der *C*
Standardbibliothek gesprochen, die in die C++ Standardbibliothek
übernommen
wurden. Die C++ Standardbibliothek kennt insgesamt 68 Header. Davon
sind
32 Header echte C++ Header, deren Inhalt vom C++
Standardisierungsgremium
definiert wird. Es gibt weitere 18 Header, deren Inhalt im wesentlichen
vom C Standardisierungsgremium definiert wird, die allerdings teilweise
für C++ angepaßt sind und die inbesondere einen anderen Namen als die
Header in der C Standardbibliothek haben. Zu dieser Gruppe von Headern
gibt es noch Versionen, die genauso heißen, wie die Header in der C
Standardbibliothek, deren Inhalt aber auch leicht angepaßt ist. Nur um
die letzten beiden Gruppen von Headern ging es bei meiner Aussage, die
..h-Versionen zu perferrien. Für die echten C++ Header gibt es
[offiziell]
keine .h-Version.
Hier ist die komplette Liste aller Header-Files in C++, aufgebrochen
nach ihrer Art:
C++ Header:
<algorithm> <bitset> <complex> <deque> <exception>
<fstream> <functional> <iomanip> <ios> <iosfwd> <iostream>
<istream> <iterator> <limits> <list> <locale> <map>
<memory> <new> <numeric> <ostream> <queue> <set> <sstream>
<stack> <stdexcept> <streambuf> <string> <typeinfo>
<utility> <valarray> <vector>
new-style C Header:
<cassert> <cctype> <cerrno> <cfloat> <ciso646> <climits>
<clocale> <cmath> <csetjmp> <csignal> <cstdarg> <cstddef>
<cstdio> <cstdlib> <cstring> <ctime> <cwchar> <cwctype>
old-style C Header:
<assert.h> <ctype.h> <errno.h> <float.h> <iso646.h>
<limits.h> <locale.h> <math.h> <setjmp.h> <signal.h>
<stdarg.h> <stddef.h> <stdio.h> <stdlib.h> <string.h>
<time.h> <wchar.h> <wctype.h>
--
<mailto:dietmar_kuehl (AT) yahoo (DOT) com> <http://www.dietmar-kuehl.de/>
<http://www.contendix.com> - Software Development & Consulting
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|