Фиаско с порядком статической инициализации

В его «Мышлении на 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 также будет установлено в ноль, нарушая всю технику.

10
задан yapper 20 September 2012 в 17:48
поделиться