std:: cerr, std:: wcerr
|
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) |