Namespaces
Variants

std:: cerr, std:: wcerr

From cppreference.net
< cpp ‎ | io
Определено в заголовке <iostream>
extern std:: ostream cerr ;
(1)
extern std:: wostream wcerr ;
(2)

Глобальные объекты std::cerr и std::wcerr управляют выводом в буфер потока реализации-определенного типа (производного от std::streambuf и std::wstreambuf соответственно), ассоциированным со стандартным потоком ошибок C stderr .

Эти объекты гарантированно инициализируются во время или до первого создания объекта типа std::ios_base::Init и доступны для использования в конструкторах и деструкторах статических объектов с упорядоченной инициализацией (при условии, что <iostream> включен до определения объекта).

Если не была выполнена команда std :: ios_base :: sync_with_stdio ( false ) , безопасно обращаться к этим объектам из нескольких потоков как для форматированного, так и для неформатированного вывода.

После инициализации, ( std :: cerr . flags ( ) & unitbuf ) ! = 0 (аналогично для std::wcerr ), что означает, что любой вывод, отправленный в эти объекты потоков, немедленно сбрасывается в ОС (через деструктор std::basic_ostream::sentry ).

Кроме того, std :: cerr . tie ( ) возвращает & std:: cout (аналогично для std::wcerr и std::wcout ), что означает: любая операция вывода для std::cerr сначала выполняет std:: cout . flush ( ) (через конструктор std::basic_ostream::sentry ).

Содержание

Примечания

Буква 'c' в названии означает "character" ( stroustrup.com FAQ ); cerr означает "character error (stream)", а wcerr означает "wide character error (stream)".

Пример

Вывод в stderr через std::cerr сбрасывает ожидающий вывод в std::cout , тогда как вывод в stderr через std::clog этого не делает.

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

Возможный вывод:

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

Отчеты о дефектах

Следующие отчеты об изменениях в поведении, являющиеся дефектными, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 455 C++98 std :: cerr . tie ( ) и
std :: wcerr . tie ( ) возвращали нулевые указатели
они возвращают & std:: cout и
& std:: wcout соответственно

Смотрите также

инициализирует объекты стандартных потоков
(публичный класс-член std::ios_base )
записывает в стандартный поток ошибок C stderr
(глобальный объект)
записывает в стандартный поток вывода C stdout
(глобальный объект)
выражение типа FILE * связанное с входным потоком
выражение типа FILE * связанное с выходным потоком
выражение типа FILE * связанное с потоком вывода ошибок
(макроконстанта)