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

时间:2010-09-23 17:19:21

标签: c++ design-patterns iostream

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

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

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

1 个答案:

答案 0 :(得分:5)

没有编译魔术。

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