C++ iostream对象cin、cout、cerr和clog是如何实现的?
iostream对象cin、cout、cerr和clog是在iostream头中声明的对象 我知道,在某些编译器中,可能会在构建这些iostream对象之前尝试使用它们,因此在某些情况下,它们必须受到“静态初始化顺序失败”的影响。在那些使用std::cout等人总是安全的编译器中,这些对象实际上是如何构造的?它是否涉及引擎程序编辑器魔法,或者原则上所有的都可以用标准C++?C++ iostream对象cin、cout、cerr和clog是如何实现的?,c++,design-patterns,iostream,C++,Design Patterns,Iostream,iostream对象cin、cout、cerr和clog是在iostream头中声明的对象 我知道,在某些编译器中,可能会在构建这些iostream对象之前尝试使用它们,因此在某些情况下,它们必须受到“静态初始化顺序失败”的影响。在那些使用std::cout等人总是安全的编译器中,这些对象实际上是如何构造的?它是否涉及引擎程序编辑器魔法,或者原则上所有的都可以用标准C++? cout等似乎要么是全局变量,要么是单例:为什么全局变量和单例通常被认为是邪恶的,但在这种特殊情况下似乎不是 没有编译器的
cout等似乎要么是全局变量,要么是单例:为什么全局变量和单例通常被认为是邪恶的,但在这种特殊情况下似乎不是 没有编译器的魔力
IIRC,标准实现是在标头中定义一个全局常量对象。在每个包含该标题的翻译单元中,创建一个这样的对象。它的构造函数递增计数器,其析构函数递减计数器。从0递增到1时,将创建控制台流对象,从1递减到0时,将销毁这些对象 没有编译器的魔力
IIRC,标准实现是在标头中定义一个全局常量对象。在每个包含该标题的翻译单元中,创建一个这样的对象。它的构造函数递增计数器,其析构函数递减计数器。从0递增到1时,将创建控制台流对象,从1递减到0时,将销毁这些对象 静态初始化顺序失败?如果编译器标准库编写者不知道他们在做什么,他们将面临失败。所谓的失败只不过是没有经验的开发人员的问题,他们没有意识到这个问题。有许多技术可以保证相对顺序,确保在首次使用之前创建std::cin(和系列)非常简单。不要把一切从C++ FAQ看作字面意思。“欧根康斯坦丁丁卡:谢谢你发现了这一点;我已经相应地编辑了我的问题。@Martin York:我知道确保我自己的代码不受此问题影响的技巧。我不清楚的是,如何确保多个开发人员使用的库代码也不会受到失败的影响。静态初始化顺序失败?如果编译器标准库编写人员不知道他们在做什么,他们将面临失败。所谓的失败只不过是没有经验的开发人员的问题,他们没有意识到这个问题。有许多技术可以保证相对顺序,确保在首次使用之前创建std::cin(和系列)非常简单。不要把一切从C++ FAQ看作字面意思。“欧根康斯坦丁丁卡:谢谢你发现了这一点;我已经相应地编辑了我的问题。@Martin York:我知道确保我自己的代码不受此问题影响的技巧。我不清楚的是,如何确保多个开发人员使用的库代码也不会受到破坏。这个习惯用法也有一个名称:谢谢-我不知道nifty/Schwarz计数器习惯用法。这个习惯用法也有一个名称:谢谢-我不知道nifty/Schwarz计数器习惯用法。