В его «Мышлении на C ++» ( Глава 10) Экель описывает технику, которую впервые применил Джерри Шва. rz, чтобы разрешить фиаско. Он говорит, что если мы хотим инициализировать 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
также будет установлено в ноль, нарушая всю технику.