См. Также Порядок инициализации статических переменных
Для 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();
У меня сейчас нет удобного gcc, поэтому я не могу это проверить, но я использовал его раньше.
Другое более простое и более переносимое решение состоит в том, чтобы избежать статической инициализации и явно создавать синглтоны по порядку в некотором четко определенном месте в main.
// 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
...
}
Помните, что с выходом из программы все будет так же ужасно с одиночками, поэтому часто лучше сделать это явным.