Del*_*llo 10 c++ static initialization static-order-fiasco
在他的"用C++思考"(第10章)中,Eckel描述了Jerry Schwarz为解决惨败而开创的技术.他说如果我们想要将x初始化为100和y到200并在所有翻译单元之间共享它们,我们创建一个如下所示的Initializer.h:
extern int x;
extern int y;
class Initializer {
   static int initCount;
   // if (initCount++ == 0) x = 100 & y = 200
   /* ... */
};
static Initializer init;
在实现文件中我们有
#include "Initializer.h"
int x;
int y;
int Initializer::initCount;
和Eckel说"静态初始化(在实现文件中)将强制所有这些值为零".
让我考虑以下情况:编译器在包含该头的其他文件之后处理实现文件(这意味着x和y已经在该另一个文件中设置为100和200).编译器看到了int x,它会做什么?它会将x和y设置为零,从而消除初始化和以前文件中的所有可能更改吗?但如果确实如此,那么initCount也将设置为零,打破整个技术.
但如果这是真的,并且编译器在另一个文件之后处理实现文件,那么它会将 x 和 y 设置为零,从而消除初始化和先前文件中所有可能的更改?
我不确定你的意思是什么。如果x和y是在其他文件中定义的,那么就会出现链接器冲突,并且程序根本无法编译。
如果x,y并且最重要的Initializer::initCount是以这种方式实现,则程序中将存在它们的唯一实例;0它们实际上是全局的,并且将在程序启动时、在构造任何对象之前进行初始化Initializer(由于包含声明static该类实例的标头)。a 的每次构造都会首先检查是否由于等原因而构造了static Initializer任何其他s。Initializerif (initCount++ == 0)
因此,第一个Initializer运行的 ctor(仍在输入 之前main)将设置所有三个值。