std:: cerr, std:: wcerr
|
Definido en el encabezado
<iostream>
|
||
|
extern
std::
ostream
cerr
;
|
(1) | |
|
extern
std::
wostream
wcerr
;
|
(2) | |
Los objetos globales
std::cerr
y
std::wcerr
controlan la salida a un búfer de flujo de tipo definido por la implementación (derivado de
std::streambuf
y
std::wstreambuf
, respectivamente), asociado con el flujo de error estándar de C
stderr
.
Se garantiza que estos objetos se inicialicen durante o antes de la primera vez que se construye un objeto de tipo std::ios_base::Init y están disponibles para su uso en los constructores y destructores de objetos estáticos con inicialización ordenada (siempre que se incluya <iostream> antes de que se defina el objeto).
A menos que se haya emitido std :: ios_base :: sync_with_stdio ( false ) , es seguro acceder concurrentemente a estos objetos desde múltiples hilos tanto para salida formateada como no formateada.
Una vez inicializado,
(
std
::
cerr
.
flags
(
)
&
unitbuf
)
!
=
0
(lo mismo para
std::wcerr
) significa que cualquier salida enviada a estos objetos de flujo se vacía inmediatamente al sistema operativo (a través del destructor de
std::basic_ostream::sentry
).
Además,
std
::
cerr
.
tie
(
)
devuelve
&
std::
cout
(lo mismo para
std::wcerr
y
std::wcout
), lo que significa que cualquier operación de salida en
std::cerr
primero ejecuta
std::
cout
.
flush
(
)
(a través del constructor de
std::basic_ostream::sentry
).
Contenidos |
Notas
La 'c' en el nombre se refiere a "carácter" (
stroustrup.com FAQ
);
cerr
significa "flujo de error de caracteres" y
wcerr
significa "flujo de error de caracteres anchos".
Ejemplo
Salida a
stderr
mediante
std::cerr
vacía la salida pendiente en
std::cout
, mientras que la salida a
stderr
mediante
std::clog
no lo hace.
#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"; }
Salida posible:
This output from main is not tie()'d to cout Output from thread...This output is tie()'d to cout ...thread calls flush()
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.
| DR | Se aplica a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 455 | C++98 |
std
::
cerr
.
tie
(
)
y
std :: wcerr . tie ( ) devolvían punteros nulos |
devuelven
&
std::
cout
y
& std:: wcout respectivamente |
Véase también
|
inicializa los objetos de flujo estándar
(clase miembro pública de
std::ios_base
)
|
|
|
escribe al flujo de error estándar de C
stderr
(objeto global) |
|
|
escribe al flujo de salida estándar de C
stdout
(objeto global) |
|
|
expresión de tipo
FILE
*
asociada con el flujo de entrada
expresión de tipo FILE * asociada con el flujo de salida expresión de tipo FILE * asociada con el flujo de salida de error (constante macro) |