IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Pourquoi cout est-il défini comme cela?


Sujet :

C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Points : 21
    Points
    21
    Par défaut Pourquoi cout est-il défini comme cela?
    Bonjour,

    j'aimerais créer un système de fichiers similaire à cout / cin / clog / cerr.

    Ma première idée était de créer des classes pour gérer le fichier d'entrée, le journal, etc.
    Pour que ces classes soient accessibles partout, j'avais d'abord pensé à des singletons.

    Mais, en regardant de plus près, il semble que cout soit en fait une instance de ostream déclarée avec le mot-clé "extern" pour assurer sa globalité dans le programme.
    J'imagine que je devrais également adopter cette approche, en déclarant externes des instances de ofstream et ifstream.
    Mais j'ai beaucoup de mal à le justifier.
    Pour faire simple : cela ressemble à première vue à une approche héritée du langage C.

    Est-ce que vous pouvez m'expliquer l'intérêt d'utiliser le mot-clé extern plutôt que le mot-clé static dans un singleton?

    Merci infiniment pour votre aide.

  2. #2
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Tu trouveras ta réponse ici:

    http://en.wikibooks.org/wiki/More_C%.../Nifty_Counter

    C'est une affaire d'initialisation et de fermeture dans le bon ordre...

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Points : 21
    Points
    21
    Par défaut
    Bonjour stendhal666,

    merci beaucoup pour ton lien mais je n'ai pas compris la réponse qu'il apporte à ma question.
    J'ai l'impression qu'il montre plutôt comment gérer l'initialisation et la fermeture d'objets statiques.
    C'est un problème compliqué qui dépasse même le cadre de l'idiome que tu fournis quand tu projettes de faire de la programmation concurrentielle.
    Mais cela se gère avec des singletons (voir les travaux d'Alexandrescu sur le sujet).

    De plus, je ne pense pas que cout soit géré avec l'idiome que tu mentionnes, contrairement à ce qui est affirmé dans ton lien.
    Il me semble qu'il s'agit d'une instance de ostream et que la globalité est justement assurée par le mot-clé "extern".
    A ma connaissance, il n'y a pas de notion explicite de comptage d'instance.

    Reformulée très simplement, ma question pourrait être : pourquoi utiliser "extern" plutôt que "static" pour gérer des entrées/sorties de façon globale?

  4. #4
    Membre chevronné

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Eh bien, j'avais tendance à faire confiance à cette source, mais l'argument d'autorité est toujours mauvais

    En revanche, si tu es d'accord avec moi que cout, clog, cerr, etc. sont des instances de ostream, comment veux-tu les implémenter comme singleton (c'est à dire classe avec une et une seule instance) ?

    Sur le mot clé extern, je ne suis pas sûr de l'utilité (plutôt que de définir une instance statique (!= singleton) dans le header). Peut-être est-ce pour factoriser la récupération de la console avec la librairie héritée de C.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 129
    Points : 33 061
    Points
    33 061
    Billets dans le blog
    4
    Par défaut
    std est un namespace.
    extern indique "cette variable existe mais est déclaré dans une autre unité de compilation".
    static indique "cette variable n'existe que dans cette unité de compilation, chaque unité de compilation doit la redéfinir". Même comportement qu'un namespace anonyme.
    static serait possible s'il s'agissait d'une structure mais pas pour un namespace.

  6. #6
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 282
    Points : 11 036
    Points
    11 036
    Par défaut
    Ce ne sont pas des singletons, mais des variables globales -> d'où extern.
    cout est un globale de type ostream dont le streambuf est en fait un filebuf. Et il y a une feinte pour s'assurer que cout est correctement initialisé avant un maximum de choses.

    Je suppose que "static" est à interpréter comme "static class storage" -> i.e. une variable qui vit dans l'espace des globales ; et pas comme à visibilité limité à l'UT courante. Le mot est porteur des 2 sens qui parfois sont incarnés simultanément dans certains variables.

    Bref, quand on veut écrire des choses qui ressemblent à des flux mais qui font des trucs légèrement différent, c'est les streambuf qu'il faut spécialiser. Après, même cout pourra utiliser ton streambuf que tu auras ajusté à tes besoins.

    PS: les singletons ont le même genre de propriétés indésirables que les globales.

Discussions similaires

  1. Réponses: 13
    Dernier message: 12/11/2011, 19h20
  2. [E-00]tester si une cellule est définie comme liste de validation ?
    Par Australia dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 01/12/2008, 09h17
  3. Réponses: 17
    Dernier message: 07/01/2008, 12h40
  4. Réponses: 5
    Dernier message: 17/08/2006, 17h32
  5. Réponses: 6
    Dernier message: 09/02/2006, 12h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo