在他的“Thinking in 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
也将被设置为零,从而破坏整个技术。