Spec-Zone.ru › C++

std::cerr, std::wcerr

Определено в заголовочном файле <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' в названии относится к "символу" (stroustrup.com FAQ); cerr означает "ошибка символьного потока", а wcerr означает "ошибка потока широких символов".

Пример

Вывод в 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 соответственно

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/cerr

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API