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» в названии означает «character» («символ») (FAQ на stroustrup.com); 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/cpp/io/cerr