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 соответственно |
См. также
| инициализирует стандартные объекты потока (общедоступный член класса std::ios_base) |
|
записывает в стандартный поток ошибок C stderr.(глобальный объект) |
|
записывает в стандартный поток вывода C stdout.(глобальный объект) |
|
выражение типа FILE* , связанное с входным потокомвыражение типа FILE* , связанное с выходным потокомвыражение типа FILE* , связанное с потоком ошибок (макроконстанта) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/io/cerr