C++

Sry, dass ich klugscheiße, aber ich denke man sollte dich verbessern: Funktionsaufruf ist es ja wirklich nicht. Also nicht, dass wir unseren neuen Freund verwirren hier... :D

betagurke: du musst auch alle geschweiften Klammern schließen, also auch die der switchanweisung.
Was solls denn sonst sein? :ugly:

Kommt halt aus den Tiefen des iostream Header

Was das Ding am Ende wirklich GENAU macht, müsste man halt nachsehen, aber ich wüsste jetzt nicht, wie ich es sonst nennen soll, als nen Funktionsaufruf.

Eigentlich steht da ja std::endl

ARg. mom, ich seh was du meinst :klatsch: Klar, für nen Funktionsaufruf, müsste endl() dastehen.... Also müsste es ein define sein, was man verwendet.
 
Wenn schon Klugscheißern, dann wenigstens richtig: endl ist ein (Stream-)Manipulator. Läuft letztendlich aber wieder eher auf eine Funktion hinaus.
 
Naja, aber ein "richtiger" Funktionsaufruf direkt ist es nicht, da die ja () haben. Also muss es ein Define sein.

Ich glaub ich muss echt mal in die Klasse rein schauen :ugly:
 
Naja, da gabs ja aber vorher auch Kritik dran, als ich es als Funktion bezeichnet habe :rolleyes:

Was wenn man es GANZ genau nimmt ja auch zutrifft, da das endl an sich halt keine Funktion ist, auch wenn damit natürlich eine Funktion ausgeführt wird....

Irgendwie driftet das aber alles in Spitzfindigkeiten ab, die glaub ich eh keine Sau interessieren (inkl. mir :rolleyes:)
 
Ja ich wollte es nicht erläeutern, weil wir den netten Betagurke dann nurnoch mehr verwirren :D

Aber durch eure Kritik hab ich nochmal nachgeforscht, denn es ist DOCH anders als ich dachte.
Ich hatte angenommen:
endl ist irgendeine Konstante oder Makro, welches per die überladenen << operatoren in die cout klasse geschoben wird. Die Klasse verwendet dann diese Konstante, um etwas damit zu machen.
ABER, das scheint wohl nicht ganz richtig zu sein, denn es gibt zumindest eine Funktion, die tatsächlich endl() heißt:
Code:
_CRTIMP2_PURE inline basic_ostream<char, char_traits<char> >&
    __CLRCALL_OR_CDECL endl(basic_ostream<char, char_traits<char> >& _Ostr)
    {    // insert newline and flush byte stream
    _Ostr.put('\n');
    _Ostr.flush();
    return (_Ostr);
    }

Es ist tatsächlich so, dass das "endl" was wir nach einem cout schreiben ein Funktionspointer ist. Es gibt eine Variante des überladenen Operators <<, der Funktionspointer (in unserem Fall: "ios_base& ( *pf )(ios_base&)" ) akzeptiert. Und mit endl übergeben wir der überladenen Operator funktion den Funktionszeiger auf endl, welcher die Funktion endl dann auch aufruft.

Pff, schön kompliziert :D
Danke übrigens, dass ihr nochmal gemeckert habt, hat mich schlauer gemacht (ist ernst gemeint :) )

Falls noch jemand diskutieren möchte: Kommt mal in den ProgrammiererChannel (siehe meine Signatur)

mfg
Lukas
 
Zurück