Запрос подробного описания "Статической инициализации заказа 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,

Другие вопросы по тегам