iostream对象cin、cout、cerr和clog是在iostream报头中声明的对象。
我知道,在某些编译器中,可能会在构造这些iostream对象之前尝试使用它们,因此在某些情况下,它们必须受到“静态初始化顺序失败”的影响。在那些使用std::cout等人总是安全的编译器中,这些对象实际上是如何构造的?它是否涉及到底层编译器的魔力,或者原则上是否都可以用标准的C++来完成?
cout等似乎要么是全局变量,要么是单例:为什么全局变量和单例通常被认为是邪恶的,但在这种特殊情况下似乎不是?
发布于 2010-09-24 01:22:47
没有编译器的魔力。
IIRC,标准实现是在头部中定义一个全局常量对象。在每个翻译单元中,包括该报头,创建一个这样的对象。它的构造函数递增计数器,析构函数递减计数器。当从0递增到1时,创建控制台流对象,当从1递减到0时,它们被销毁。
https://stackoverflow.com/questions/3780898
复制相似问题