【发布时间】: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