C ++ 03 Standard [basic.start.init] le point 3 indique:
Il est défini par l’implémentation que l’initialisation dynamic (8.5, 9.4, 12.1, 12.6.1) d’un object de la scope de l’espace de noms soit effectuée ou non avant la première instruction de main. Si l’initialisation est différée à un moment donné après la première déclaration de main, elle doit avoir lieu avant la première utilisation d’une fonction ou d’un object défini dans la même unité de traduction que l’object à initialiser.
Les compilateurs Microsoft, en fonction de considérations de démarrage supplémentaires , effectuent l’initialisation avant de main()
.
Je n’ai pas pu obtenir de documentation indiquant le comportement des compilateurs GNU et Sun Forte.
Est-ce que quelqu’un peut:
FWIW, j’ai observé le comportement de g ++ de GNU et de CC de SUN et tous les deux ont effectué l’initalisation avant le principal, bien que je n’accepte pas cela comme une réponse définitive. ( Je peux poster le code très simple que j’avais l’habitude d’observer si quelqu’un était intéressé mais que la question était suffisamment longue. )
La réponse définitive est que tous les compilateurs effectuent une initialisation statique avant main
, à moins que les objects ne se trouvent dans une DLL chargée ultérieurement. En pratique, il est (presque) impossible de satisfaire aux exigences du texte que vous citez autrement. (Pensez à ce qui se passe s’il y a un cycle.)