`clog` 被缓冲了吗?
Is `clog` buffered?
我在很多地方看到clog
和cerr
是一样的,只是clog
有缓冲而cerr
没有。但是我在我的电脑上看不到这种行为(Ubuntu 20.04,clang 9)。这是我使用的代码:
clog << "AA";
this_thread::sleep_for(chrono::seconds(3));
clog << endl;
clog << "BB" << endl;
当我使用 cout
而不是 clog
时,前 3 秒我没有看到任何东西;然后我马上看到AA和BB。
当我使用 cerr
而不是 clog
时,我立即看到 AA,然后在 3 秒后我看到 BB。
当我使用 clog
时,我看到的与 cerr
完全一样 --- 立即 AA,然后在 3 秒后我看到 BB。
如果 clog
被缓冲,它的行为不应该像 cout
吗?
这是我的编译器中的错误吗?
这不是一个错误,clog
不应该被缓冲,事实上标准不会以任何方式将 clog
与 cout
相关联,也没有说明 clog
应该被缓冲。
它确实声明 cerr
和 clog
都与 stderr
关联,因此如果行为有一些相似之处,则应该在 clog
之间和 cerr
,这似乎是您正在经历的。
由于 stderr
被定义为无缓冲,因此 clog
也是无缓冲的逻辑,但由于未指定此行为,因此不能保证始终如此。
cout
与 stdout
关联,其缓冲设置取决于环境。通常,对于 UNIX 系统,它是行缓冲的。
29.4.3 窄流对象 [narrow.stream.objects]
ostream cout;
3 - The object cout
controls output to a stream buffer associated with the object stdout
, declared in <cstdio>
(29.12.1).
ostream cerr;
4 - The object cerr controls output to a stream buffer associated with the object stderr
, declared in <cstdio>
(29.12.1).
[...]
ostream clog;
6 - The object clog
controls output to a stream buffer associated with the object stderr
, declared in <cstdio>
(29.12.1).
我在很多地方看到clog
和cerr
是一样的,只是clog
有缓冲而cerr
没有。但是我在我的电脑上看不到这种行为(Ubuntu 20.04,clang 9)。这是我使用的代码:
clog << "AA";
this_thread::sleep_for(chrono::seconds(3));
clog << endl;
clog << "BB" << endl;
当我使用 cout
而不是 clog
时,前 3 秒我没有看到任何东西;然后我马上看到AA和BB。
当我使用 cerr
而不是 clog
时,我立即看到 AA,然后在 3 秒后我看到 BB。
当我使用 clog
时,我看到的与 cerr
完全一样 --- 立即 AA,然后在 3 秒后我看到 BB。
如果 clog
被缓冲,它的行为不应该像 cout
吗?
这是我的编译器中的错误吗?
这不是一个错误,clog
不应该被缓冲,事实上标准不会以任何方式将 clog
与 cout
相关联,也没有说明 clog
应该被缓冲。
它确实声明 cerr
和 clog
都与 stderr
关联,因此如果行为有一些相似之处,则应该在 clog
之间和 cerr
,这似乎是您正在经历的。
由于 stderr
被定义为无缓冲,因此 clog
也是无缓冲的逻辑,但由于未指定此行为,因此不能保证始终如此。
cout
与 stdout
关联,其缓冲设置取决于环境。通常,对于 UNIX 系统,它是行缓冲的。
29.4.3 窄流对象 [narrow.stream.objects]
ostream cout;
3 - The object
cout
controls output to a stream buffer associated with the objectstdout
, declared in<cstdio>
(29.12.1).
ostream cerr;
4 - The object cerr controls output to a stream buffer associated with the object
stderr
, declared in<cstdio>
(29.12.1).[...]
ostream clog;
6 - The object
clog
controls output to a stream buffer associated with the objectstderr
, declared in<cstdio>
(29.12.1).