Запрос подробного описания "Статической инициализации заказа Fiasco"
Я читал о SIOF в faq-lite и до сих пор не понимаю, почему проблема возникает. У меня есть статическая библиотека (.a), и я использую эту библиотеку, чтобы использовать ее статический тип объекта-члена const. Затем этот статический тип объекта-члена const я использую и присваиваю глобальной переменной (объекту). Но кажется, что глобальная переменная пуста, когда я использую эту глобальную переменную в своей главной или любой локальной функции. Я очевидно знаю, что моя проблема - SIOF, но я действительно не понимаю, почему мой статический объект-член const не был инициализирован.
Это была статическая библиотека, поэтому я предполагаю, что когда мы создавали нашу статическую библиотеку, объект-член статических данных const был скомпилирован и связан с этой статической библиотекой, поправьте меня, если я ошибаюсь...
//libsource.h
class foo
{
public:
....
public:
static const barbar foofaa;
};
//libsource.cpp
const barbar foo::foofaa = barbar();
//main.cpp
#include <libsource.h>
barbar foos= foo::foofaa;
int main()
{
//can't use foos because its empty
}
Пожалуйста посоветуй. Почему этот статический объект-член const не был инициализирован, даже если он находится в статической библиотеке?
Большое спасибо.
1 ответ
Порядок статической инициализации фиаско довольно прост: статические объекты в одной единице перевода инициализируются в том порядке, в котором они объявлены, но нет никакой гарантии относительно порядка, в котором статические объекты в разных единицах перевода инициализируются по отношению к каждой Другой.
Итак, в вашем конкретном примере, foos
в main.cpp
может быть инициализирован до foo::foofaa
, который объявлен в libsource.cpp
,