В своем "Думая на С++" (глава 10) Экель описывает технику, которая была впервые разработана Джерри Шварцем для решения фиаско. Он говорит, что если мы хотим инициализировать 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;
и Эккель говорит, что "статическая инициализация (в файле реализации) заставит все эти значения равными нулю".
Позвольте мне рассмотреть следующий случай: компилятор обрабатывает файл реализации после некоторого другого файла с включенным заголовком (это означает, что x и y уже были установлены в 100 и 200 в этом другом файле). Компилятор видит int x
, и что он будет делать? Будет ли он устанавливать x и y на ноль, исключая инициализацию и все возможные изменения в предыдущих файлах? Но если это так, то initCount
также будет установлено в ноль, разрушая всю технику.