C++ C++;通过Schwartz计数器进行静态初始化

C++ C++;通过Schwartz计数器进行静态初始化,c++,C++,用于确保在使用全局对象之前对其进行初始化 请考虑下面使用的施瓦兹计数器。 Foo.h文件: class Foo { Foo::Foo(); }; 文件Foo.cpp: #include "Foo.h" // Assume including Mystream.h provides access to myStream and that // it causes creation of a file-static object that initializes // myStream (

用于确保在使用全局对象之前对其进行初始化

请考虑下面使用的施瓦兹计数器。

Foo.h文件:

class Foo
{
   Foo::Foo();
};
文件Foo.cpp:

#include "Foo.h"

// Assume including Mystream.h provides access to myStream and that
// it causes creation of a file-static object that initializes
// myStream (aka a Schwartz counter).
#include "MyStream.h"

Foo::Foo()
{
   myStream << "Hello world\n";
}
注意Global.cpp不像Foo.cpp那样获得文件静态初始值设定项对象。在这种情况下,Schwartz计数器如何确保MyStream初始值设定项(以及MyStream对象本身)在foo之前初始化?或者Schwartz计数器在这种情况下会失败吗?

使用(以Jerry Schwartz的名字命名,Jerry Schwartz设计了IOStreams库的基础,现在是标准中的基础;请注意,他不能因为许多奇怪的选择而受到指责,因为这些选择被标记到原始设计上)可能导致在构建对象之前访问对象。最明显的场景是在构造全局对象的过程中调用函数,该函数使用通过Schwartz计数器构造的自身全局调用另一个翻译单元(我使用
std::cout
作为由Schwartz计数器保护的全局,以保持示例的简短):

//文件a.h
使a()无效;
//文件a.cpp
#包括
void a(){std::cout
#include "Foo.h"

Foo foo;
// file a.h
void a();

// file a.cpp
#include <iostream>
void a() { std::cout << "a()\n"; }

// file b.cpp
#include <a.h>
struct b { b() { a(); } } bobject;