Namensräume
Varianten
Aktionen

std::cerr, std::wcerr

Von cppreference.com
< cpp‎ | io
 
 
 
 
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) [bearbeiten]
schreibt in den Standard-C-Fehlerstrom stderr
(globales Objekt)[bearbeiten]
schreibt in den Standard-C-Ausgabestrom stdout
(globales Objekt)[bearbeiten]
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) [bearbeiten]