如何实现iostream对象cin,cout,cerr和clog?

Sim*_*ott 1 c++ iostream design-patterns

iostream对象cin,cout,cerr和clog是iostream头中声明的对象.

我知道在一些编译器中可能会在构造它们之前尝试使用这些iostream对象,所以在某些情况下它们必须受到"静态初始化顺序惨败"的影响.在那些使用std :: cout等人总是安全的编译器中,这些对象如何实际构建?它是否涉及引擎盖下的编译器魔法,或者它原则上是否都可以用标准C++完成?

std :: cout等似乎是全局变量或单例:为什么全局变量和单例通常被认为是邪恶的,但在这种特殊情况下似乎不是?

sbi*_*sbi 5

没有编译魔术.

IIRC,标准实现是在头文件中定义一个全局常量对象.在每个翻译单元中包括该标题,创建一个这样的对象.它的构造函数递增一个计数器,它的析构函数递减它.当从0递增到1时,将创建控制台流对象,当从1递减到0时,它们将被销毁.