В свое время отказался от раздумий по очередности вызова конструкторов глобальных объектов.
Сейчас использую следующую схему:
1) Собственно сам конструктор
2) Этап Init()
3) Этам Run()
В самом конструкторе объект ведет себя изолированно от внешнего мира. Категорически не допускается взаимодействия с другими объектами (они у меня зачастую в другой единицы трансляции)
На этапе Init() происходит "налаживание связей" между объектами (обмен информацией, финальная инициализация и тд). На этапе Run() запускаются таски, включаются прерывания и тд.
Этапы Init и Run запускаются из main, что гарантирует создание глобальных объектов к этому моменту.
Код
///@function main()
///Main function
int main()
{
* * *
ClSystemService::Instance()->InitServices();
ClSystemService::Instance()->RunServices();
* * *
}
Либо возможен другой вариант: использование паттерна Singleton. Тогда обращение к объекту будет гарантировать его наличие