std::cerr, std::wcerr
| Definido en el archivo de 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 datos de tipo definido por la implementación (derivados de std::streambuf y std::wstreambuf, respectivamente), asociado con el flujo de salida de error estándar de C: stderr.
Está garantizado que la construcción de estos objetos ocurra antes o durante el llamado al primer constructor de un objeto tipo std::ios_base::Init, y que esté disponible para su uso en los constructores y destructores de objetos estáticos con inicialización ordenada (siempre y cuando <iostream> sea incluido antes de que el objeto sea definido).
Es seguro acceder a estos objetos simultáneamente desde varios hilos, tanto para la salida con formato como para la salida sin formato, a menos que sync_with_stdio(false) haya sido emitido.
Una vez inicializado, el objeto std::cerr es activado ((std::cerr.flags() & unitbuf) != 0, y de igual manera para std::wcerr), lo que significa que cualquier flujo enviado a estos objetos es descargado inmediatamente al sistema operativo (a través del destructor std::basic_ostream::sentry).
Adicionalmente, std::cerr.tie() retorna &std::cout (de igual manera para std::wcerr con std::wcout), lo que significa que cualquier operación de salida en std::cerr primero ejecuta std::cout.flush() (a través del constructor std::basic_ostream::sentry). (desde C++11)
Notas
La 'c' en el nombre de los objetos se refiere a caracter ("character") (stroustrup.com FAQ); cerr significa flujo de error de caracter ("character error (stream)") y wcerr significa flujo de error de caracter amplio ("wide character error (stream)").
Ejemplo
El flujo de salida hacia stderr a través de std::cerr descarga los flujos pendientes en std::cout, mientras que el flujo de salida hacia stderr a través de std::clog no los descarga.
#include <thread>
#include <iostream>
#include <chrono>
void f()
{
std::cout << "Salida desde el hilo...";
std::this_thread::sleep_for(std::chrono::seconds(2));
std::cout << "...el hilo llama a flush()\n";
}
int main()
{
std::thread t1(f);
std::this_thread::sleep_for(std::chrono::seconds(1));
std::clog << "Esta salida desde main no está atada a cout\n";
std::cerr << "Esta salida desde main sí está atada a cout\n";
t1.join();
}
Salida:
Esta salida desde main no está atada a cout
Salida desde el hilo...Esta salida desde main sí está atada a cout
...el hilo llama a flush()
Ver también
| Inicializa los objetos 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) |