std:: cerr, std:: wcerr
|
Definiert im Header
<iostream>
|
||
|
extern
std::
ostream
cerr
;
|
(1) | |
|
extern
std::
wostream
wcerr
;
|
(2) | |
Die globalen Objekte
std::cerr
und
std::wcerr
steuern die Ausgabe an einen Streampuffer eines implementierungsdefinierten Typs (abgeleitet von
std::streambuf
bzw.
std::wstreambuf
), der mit dem standardmäßigen C-Fehlerausgabestrom
stderr
verbunden ist.
Diese Objekte sind garantiert während oder vor dem ersten Mal initialisiert, wenn ein Objekt vom Typ std::ios_base::Init konstruiert wird, und sind in den Konstruktoren und Destruktoren von statischen Objekten mit geordneter Initialisierung verfügbar (sofern <iostream> vor der Definition des Objekts eingebunden wird).
Sofern nicht std :: ios_base :: sync_with_stdio ( false ) aufgerufen wurde, ist es sicher, diese Objekte von mehreren Threads aus gleichzeitig für formatierte und unformatierte Ausgabe zu verwenden.
Nach der Initialisierung,
(
std
::
cerr
.
flags
(
)
&
unitbuf
)
!
=
0
(gleiches gilt für
std::wcerr
), was bedeutet, dass jede Ausgabe, die an diese Stream-Objekte gesendet wird, sofort an das Betriebssystem geleert wird (über den Destruktor von
std::basic_ostream::sentry
).
Zusätzlich gibt
std
::
cerr
.
tie
(
)
&
std::
cout
zurück (dasselbe gilt für
std::wcerr
und
std::wcout
), was bedeutet, dass jede Ausgabeoperation auf
std::cerr
zuerst
std::
cout
.
flush
(
)
ausführt (über den Konstruktor von
std::basic_ostream::sentry
).
Inhaltsverzeichnis |
Hinweise
Das 'c' im Namen steht für "character" (
stroustrup.com FAQ
);
cerr
bedeutet "character error (stream)" und
wcerr
bedeutet "wide character error (stream)".
Beispiel
Ausgabe an
stderr
über
std::cerr
leert den ausstehenden Puffer von
std::cout
, während Ausgabe an
stderr
über
std::clog
dies nicht tut.
#include <chrono> #include <iostream> #include <thread> using namespace std::chrono_literals; void f() { std::cout << "Output from thread..."; std::this_thread::sleep_for(2s); std::cout << "...thread calls flush()" << std::endl; } int main() { std::jthread t1{f}; std::this_thread::sleep_for(1000ms); std::clog << "This output from main is not tie()'d to cout\n"; std::cerr << "This output is tie()'d to cout\n"; }
Mögliche Ausgabe:
This output from main is not tie()'d to cout Output from thread...This output is tie()'d to cout ...thread calls flush()
Fehlerberichte
Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | Angewendet auf | Verhalten wie veröffentlicht | Korrektes Verhalten |
|---|---|---|---|
| LWG 455 | C++98 |
std
::
cerr
.
tie
(
)
und
std :: wcerr . tie ( ) gaben Nullzeiger zurück |
sie geben
&
std::
cout
und
& std:: wcout zurück |
Siehe auch
|
initialisiert Standard-Stream-Objekte
(öffentliche Mitgliedsklasse von
std::ios_base
)
|
|
|
schreibt in den Standard-C-Fehlerstrom
stderr
(globales Objekt) |
|
|
schreibt in den Standard-C-Ausgabestrom
stdout
(globales Objekt) |
|
|
Ausdruck vom Typ
FILE
*
assoziiert mit dem Eingabestrom
Ausdruck vom Typ FILE * assoziiert mit dem Ausgabestrom Ausdruck vom Typ FILE * assoziiert mit dem Fehlerausgabestrom (Makrokonstante) |