std::cerr, std::wcerr
| Definiert in Header <iostream> |
||
| extern std::ostream cerr; |
(1) | |
| extern std::wostream wcerr; |
(2) | |
Die globalen Objekte std::cerr und std::wcerr steuern die Ausgabe in einen Stream-Puffer vom Implementierungs-definierten Typ (abgeleitet von std::streambuf bzw. std::wstreambuf), der mit dem Standard-C-Fehlerausgabe-Stream stderr verbunden ist.
Es wird garantiert, dass diese Objekte während oder vor der ersten Konstruktion eines Objekts vom Typ std::ios_base::Init initialisiert werden und für die Verwendung in den Konstruktoren und Destruktoren von statischen Objekten mit geordneter Initialisierung verfügbar sind (solange <iostream> vor der Definition des Objekts inkludiert wird).
Sofern nicht std::ios_base::sync_with_stdio(false) aufgerufen wurde, ist es sicher, diese Objekte aus mehreren Threads für formatierte und unformatierte Ausgaben gleichzeitig zu verwenden.
Nach der Initialisierung ist (std::cerr.flags() & unitbuf) != 0 (dasselbe gilt für std::wcerr), was bedeutet, dass jede an diese Stream-Objekte gesendete Ausgabe 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 leert (über den Konstruktor von std::basic_ostream::sentry).
Inhalt |
[bearbeiten] Hinweise
Das 'c' im Namen steht für "character" ("Zeichen") (stroustrup.com FAQ); cerr bedeutet "character error (stream)" und wcerr bedeutet "wide character error (stream)".
[bearbeiten] Beispiel
Die Ausgabe nach stderr über std::cerr leert die ausstehende Ausgabe auf std::cout, während die Ausgabe nach 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()
[bearbeiten] Defect reports
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 455 | C++98 | std::cerr.tie() und std::wcerr.tie() gaben Nullzeiger zurück |
sie geben stattdessen &std::cout und &std::wcout zurück |
[bearbeiten] Siehe auch
| initialisiert Standard-Stream-Objekte (public member class of 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*, der dem Eingabestrom zugeordnet ist Ausdruck vom Typ FILE*, der dem Ausgabestrom zugeordnet ist Ausdruck vom Typ FILE*, der dem Fehlerstrom zugeordnet ist (Makrokonstante) |