【问题标题】:How are iostream objects cin, cout, cerr, and clog implemented?iostream 对象 cin、cout、cerr 和 clog 是如何实现的?
【发布时间】:2011-04-16 09:43:08
【问题描述】:

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

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

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

【问题讨论】:

  • 静态初始化命令惨败?
  • 如果编译器标准库的编写者不知道他们在做什么,他们将遭受惨败。所谓的 Fiasco 只是对于没有意识到问题的没有经验的开发人员来说是一个问题。有许多技术可以保证相对顺序,并且很容易确保在首次使用之前创建 std::cin (和系列)。不要将 C++ FAQ 中的所有内容都当作文字。
  • @Eugen Constantin Dinca:感谢您发现这一点;我已经相应地编辑了我的问题。
  • @Martin York:我知道确保我自己的代码不受此问题影响的技术。我不清楚的是如何确保多个开发人员使用的库代码也不受 Fiasco 的影响。

标签: c++ design-patterns iostream


【解决方案1】:

没有编译器魔法。

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

【讨论】:

猜你喜欢
  • 2011-01-16
  • 2012-11-17
  • 2011-01-25
  • 2013-05-22
  • 1970-01-01
  • 2010-12-01
  • 2016-07-08
  • 2011-02-22
  • 2013-01-16
相关资源
最近更新 更多