Они инициализируются до запуска программы (т. Е. До ввода main
).
Если в одном файле CPP имеется два или более определений (статических данных), они инициализируются в той последовательности, в которой они определены в файле (инициализируется ранее определенное / более высокое значение в файле). до следующего).
Когда имеется два или более определений (статических данных) в нескольких файлах CPP, последовательность обработки файлов CPP не определена / зависит от реализации. Это проблема, если конструктор глобальной переменной (вызываемой перед запуском программы) ссылается на другую глобальную переменную, определенную в другом файле CPP, которая, возможно, еще не была создана. Тем не менее, пункт 47 Effective C ++ Мейерса (который называется Убедитесь, что глобальные объекты инициализируются перед использованием ) действительно описывает обходной путь ...
Определить статическую переменную в заголовочном файле (она является статической, поэтому вы можете иметь несколько ее экземпляров без жалоб компоновщика)
Пусть конструктор этой переменной вызывает все, что вам нужно (в частности, создает глобальные синглеты, объявленные в заголовках)
... это метод, который может использоваться в некоторых системных заголовочных файлах, например чтобы обеспечить инициализацию глобальной переменной cin
до того, как ее используют даже конструкторы статических переменных.