彼の「ThinkinginC++」(第10章)で、Eckelは、大失敗を解決するためにJerrySchwarzによって開拓された手法について説明しています。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
もゼロに設定され、テクニック全体が分解されます。