Namespaces
Variants

std:: cerr, std:: wcerr

From cppreference.net
< cpp ‎ | io
Défini dans l'en-tête <iostream>
extern std:: ostream cerr ;
(1)
extern std:: wostream wcerr ;
(2)

Les objets globaux std::cerr et std::wcerr contrôlent la sortie vers un tampon de flux de type défini par l'implémentation (dérivé de std::streambuf et std::wstreambuf , respectivement), associé au flux de sortie d'erreur standard C stderr .

Ces objets sont garantis d'être initialisés pendant ou avant la première fois qu'un objet de type std::ios_base::Init est construit et sont disponibles pour utilisation dans les constructeurs et destructeurs d'objets statiques avec initialisation ordonnée (tant que <iostream> est inclus avant que l'objet soit défini).

À moins que std :: ios_base :: sync_with_stdio ( false ) n'ait été exécuté, il est sûr d'accéder simultanément à ces objets depuis plusieurs threads pour une sortie formatée et non formatée.

Une fois initialisé, ( std :: cerr . flags ( ) & unitbuf ) ! = 0 (idem pour std::wcerr ) signifie que toute sortie envoyée à ces objets de flux est immédiatement vidée vers le système d'exploitation (via le destructeur de std::basic_ostream::sentry ).

De plus, std :: cerr . tie ( ) retourne & std:: cout (idem pour std::wcerr et std::wcout ), ce qui signifie que toute opération de sortie sur std::cerr exécute d'abord std:: cout . flush ( ) (via le constructeur de std::basic_ostream::sentry ).

Table des matières

Notes

Le 'c' dans le nom fait référence à "caractère" ( stroustrup.com FAQ ); cerr signifie "flux d'erreur de caractères" et wcerr signifie "flux d'erreur de caractères larges".

Exemple

Sortie vers stderr via std::cerr vide la sortie en attente sur std::cout , tandis que la sortie vers stderr via std::clog ne le fait pas.

#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";
}

Sortie possible :

This output from main is not tie()'d to cout
Output from thread...This output is tie()'d to cout
...thread calls flush()

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement corrigé
LWG 455 C++98 std :: cerr . tie ( ) et
std :: wcerr . tie ( ) retournaient des pointeurs nuls
ils retournent & std:: cout et
& std:: wcout respectivement

Voir aussi

initialise les objets de flux standard
(classe membre publique de std::ios_base )
écrit dans le flux d'erreur C standard stderr
(objet global)
écrit dans le flux de sortie C standard stdout
(objet global)
expression de type FILE * associée au flux d'entrée
expression de type FILE * associée au flux de sortie
expression de type FILE * associée au flux de sortie d'erreur
(constante macro)