Les objets iostream cin, cout, cerr et clog sont des objets déclarés dans l'en-tête iostream. Je suis conscient qu'il est possible dans certains compilateurs de tenter d'utiliser ces objets iostream avant qu'ils ne soient construits, donc dans certaines circonstances, ils doivent être soumis au "fiasco d'ordre d'initialisation statique". Dans les compilateurs où il est toujours possible d'utiliser std :: cout et al, comment ces objets sont-ils construits? Cela implique-t-il la magie du compilateur sous le capot ou est-ce que cela pourrait en principe être fait avec le C++ standard? Std :: cout etc semblent être des variables globales ou singleton: pourquoi les variables globales et les singletons sont-ils généralement considérés comme maléfiques mais apparemment pas dans ce cas particulier?Comment les objets iostream cin, cout, cerr et clog sont-ils implémentés?
Répondre
Il n'y a pas de magie du compilateur. IIRC, l'implémentation standard consiste à définir un objet constant global dans l'en-tête. Dans chaque unité de traduction, cet en-tête est inclus, un tel objet est créé. Son constructeur incrémente un compteur, son destructeur le décrémente. Lors de l'incrémentation de 0 à 1, les objets du flux de la console sont créés, lorsqu'ils sont décrémentés de 1 à 0, ils sont détruits.
Cet idiome a un nom, aussi: http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Nifty_Counter – Cubbi
Merci - je n'étais pas au courant de l'idiome nifty/Schwarz Counter. –
static ** initialisation ** commande fiasco? –
Ils seraient sujets à un fiasco si les rédacteurs de la bibliothèque standard du compilateur ne savaient pas ce qu'ils faisaient. Le soi-disant Fiasco est seulement un problème pour les développeurs inexpérimentés qui ne sont pas conscients du problème. Il existe de nombreuses techniques pour garantir l'ordre relatif et il est simple de s'assurer que std :: cin (et family) sont créés avant la première utilisation. Ne prenez pas tout de la FAQ C++ comme littéral. –
@Eugen Constantin Dinca: Merci d'avoir remarqué cela; J'ai édité ma question en conséquence. –