Запрос подробного описания «Статической инициализации заказа Fiasco» - PullRequest
1 голос
/ 19 января 2011

Я читал о 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 Ответ

2 голосов
/ 19 января 2011

Порядок статической инициализации фиаско довольно прост: статические объекты в одной единице перевода инициализируются в том порядке, в котором они были объявлены, но нет никакой гарантии относительно порядка, в котором статические объекты в разных единицах перевода инициализируются с помощью уважение друг к другу.

Итак, в вашем конкретном примере foos в main.cpp может быть инициализировано до foo::foofaa, что объявлено в libsource.cpp.

...