Namespaces
Variants

std:: cerr, std:: wcerr

From cppreference.net
< cpp ‎ | io
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)