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" (
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 * связанное с потоком вывода ошибок (макроконстанта) |