Das Mischen der Ausgabe im C-Stil printf()
(oder puts()
oder putchar()
oder ...) mit der Ausgabe im C ++ - Stil std::cout << ...
kann unsicher sein. Wenn ich mich richtig erinnere, können sie separate Puffermechanismen haben, sodass die Ausgabe möglicherweise nicht in der beabsichtigten Reihenfolge angezeigt wird. (Wie AProgrammer in einem Kommentar erwähnt, sync_with_stdio
spricht dies an).
printf()
ist grundsätzlich typunsicher. Der für ein Argument erwartete Typ wird durch die Formatzeichenfolge bestimmt ( "%d"
erfordert eine int
oder etwas, zu dem befördert wird int
, "%s"
erfordert eine, char*
die auf eine korrekt terminierte Zeichenfolge im C-Stil verweisen muss usw.), aber das Übergeben des falschen Argumenttyps führt zu undefiniertem Verhalten , kein diagnostizierbarer Fehler. Einige Compiler, wie z. B. gcc, warnen recht gut vor Typinkongruenzen, können dies jedoch nur, wenn die Formatzeichenfolge ein Literal ist oder zur Kompilierungszeit anderweitig bekannt ist (was der häufigste Fall ist) - und so weiter Warnungen werden von der Sprache nicht benötigt. Wenn Sie die falsche Art von Argument übergeben, können willkürlich schlechte Dinge passieren.
Die Stream-E / A von C ++ sind dagegen viel typsicherer, da der <<
Operator für viele verschiedene Typen überlastet ist. std::cout << x
muss nicht den Typ angeben x
; Der Compiler generiert den richtigen Code für jeden Typ x
.
Auf der anderen Seite sind printf
die Formatierungsoptionen meiner Meinung nach viel praktischer. Wenn ich einen Gleitkommawert mit 3 Nachkommastellen drucken möchte, kann ich ihn verwenden "%.3f"
- und er hat keine Auswirkungen auf andere Argumente, selbst innerhalb desselben printf
Aufrufs. C ++ 's setprecision
wirkt sich dagegen auf den Status des Streams aus und kann die spätere Ausgabe durcheinander bringen, wenn Sie nicht sehr vorsichtig sind, um den vorherigen Status des Streams wiederherzustellen. (Dies ist mein persönlicher Ärger mit Haustieren. Wenn ich einen sauberen Weg vermisse, um ihn zu vermeiden, kommentieren Sie ihn bitte.)
Beide haben Vor- und Nachteile. Die Verfügbarkeit von printf
ist besonders nützlich, wenn Sie zufällig einen C-Hintergrund haben und mit diesem besser vertraut sind oder wenn Sie C-Quellcode in ein C ++ - Programm importieren. std::cout << ...
ist für C ++ idiomatischer und erfordert nicht so viel Sorgfalt, um Typinkongruenzen zu vermeiden. Beide sind gültiges C ++ (der C ++ - Standard enthält den größten Teil der C-Standardbibliothek als Referenz).
Es ist wahrscheinlich am besten, es std::cout << ...
für andere C ++ - Programmierer zu verwenden, die möglicherweise an Ihrem Code arbeiten, aber Sie können beide verwenden - insbesondere in Trace-Code, den Sie wegwerfen werden.
Und natürlich lohnt es sich, etwas Zeit mit dem Umgang mit Debuggern zu verbringen (aber in einigen Umgebungen ist dies möglicherweise nicht möglich).
printf
in der C ++ Welt? Ich vermisse hier etwas?