cerr
和 cout
都是 C++ 中用于输出的流对象,但它们有一些关键的区别,主要体现在它们的用途和输出特性上:
1. 用途
-
cout
:用于标准输出,通常是输出到屏幕。它是一个用于打印正常信息的流对象,常用于显示程序的输出。 -
cerr
:用于标准错误输出,通常也是输出到屏幕。它专门用于输出错误信息或异常信息,目的是与正常输出分开,便于调试和日志记录。
2. 缓冲
-
cout
:是缓冲的,意味着输出信息会先存储在缓冲区中,只有在缓冲区满了或者程序结束时,信息才会被实际输出到屏幕。这种方式有助于提高程序的性能,但在某些情况下,可能导致信息延迟输出。 -
cerr
:是不缓冲的,意味着信息会直接输出到屏幕,不会经过缓冲区。这使得错误信息能够更快地显示出来,便于及时发现问题。
3. 流的类型
cout
和cerr
都是输出流对象(std::ostream
类型),但它们有不同的输出目的。
4. 重定向
-
cout
:可以通过重定向将输出发送到文件或其他输出设备。 -
cerr
:通常不会被程序的标准输出重定向,因为它专门用于错误信息,帮助区分正常输出和错误输出。它可以独立地被重定向到不同的文件或者设备上。
5. 线程安全性
- 在一些实现中,
cerr
是线程安全的,这意味着多个线程可以安全地向cerr
输出信息,而不会出现输出混乱的情况。cout
在某些情况下可能需要手动同步以确保线程安全,特别是在多线程程序中。
示例代码
#include <iostream>
using namespace std;
int main() {
cout << "This is a normal output." << endl;
cerr << "This is an error message." << endl;
return 0;
}
在这个例子中:
cout
会输出正常的消息到标准输出(屏幕)。cerr
会输出错误消息到标准错误输出(屏幕),并且不会被缓冲。
总结
cout
用于正常输出,支持缓冲。cerr
用于错误输出,不支持缓冲,输出更即时。