Voir aussi Static variables initialisation order
Pour une utilisation gcc init_priority:
http://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Attributes.html
Works à travers différentes unités de traduction. Donc, votre code serait:
Foo* Foo::singleton __attribute__ ((init_priority (2000))) = new Foo();
Bar* Bar::singleton __attribute__ ((init_priority (3000))) = new Bar();
Je ne je peux pas juste avoir à portée de main gcc maintenant afin de ne pas vérifier, mais je l'ai utilisé auparavant. L'autre solution plus simple et plus portable est d'éviter l'initialisation statique et de créer explicitement les singletons dans l'ordre à un endroit bien défini dans 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
...
}
Rappelez-vous, les choses vont se noueux comme avec singletons sur la sortie du programme aussi bien, il est donc souvent préférable de le rendre explicite.