Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ iostream对象cin、cout、cerr和clog是如何实现的?_C++_Design Patterns_Iostream - Fatal编程技术网

C++ iostream对象cin、cout、cerr和clog是如何实现的?

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等似乎要么是全局变量,要么是单例:为什么全局变量和单例通常被认为是邪恶的,但在这种特殊情况下似乎不是 没有编译器的

iostream对象cin、cout、cerr和clog是在iostream头中声明的对象

我知道,在某些编译器中,可能会在构建这些iostream对象之前尝试使用它们,因此在某些情况下,它们必须受到“静态初始化顺序失败”的影响。在那些使用std::cout等人总是安全的编译器中,这些对象实际上是如何构造的?它是否涉及引擎程序编辑器魔法,或者原则上所有的都可以用标准C++?
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计数器习惯用法。