Смотрите также Static variables initialisation order
Для использования GCC init_priority:
http://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Attributes.html
работы через различные единицы перевода. Так что ваш код будет гласить:
Foo* Foo::singleton __attribute__ ((init_priority (2000))) = new Foo();
Bar* Bar::singleton __attribute__ ((init_priority (3000))) = new Bar();
У меня нет под рукой НКУ прямо сейчас, поэтому я не могу проверить это, но я использовал его раньше. Другим простым и более портативным решением является предотвращение статической инициализации и явное создание синглетонов в определенном месте внутри основного.
// Nothing in static area
void main(void)
{
// Init singletons in explicit order
{
Foo* Foo::singleton = new Foo();
Bar* Bar::singleton = new Bar();
}
// Start program execution
...
}
Помните, что все будет получить так же, как угловатое с одиночками на пути выхода из программы, а также, поэтому его часто лучше, чтобы сделать его явным.