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 :

Variables static et link


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut Variables static et link
    Bonjour à tous,

    J'ai un petit souci avec les variables static locales à une fonction et le linker sous Visual .NET. J'ai une bibliothèque static (un .lib donc) contenant une fonction du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    //dans le .h :
     
    typedef Factory<int,Model*> ModelFactory;
    ModelFactory& getModelFactory();
     
    //dans le .cpp :
    ModelFactory& getModelFactory() {
        static ModelFactory factory;
        return factory;
    }
    Cette fonction est appelée pour initialiser différentes variables static de classes de cette librairie et tout se passe bien, c'est bien la même factory qui est retourné à chaque fois.

    J'ai une autre bibliothèque qui lie avec la première. Lorsque j'appelle la fonction getModelFactory() depuis le code de cette deuxième librairie (donc l'instance locale à la fonction est sensée avoir été initialisé puisque ls variables static sont initialisées au tout début), il me réinstancie l'objet factory au lieu de me retourner l'objet déjà instancié.

    Quelqu'un saurait à quoi cela est dû ? Merci d'avance.

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Tu devrais te tourner, également, vers le concept de singleton, qui correspond exactement à la manière dont tu souhaite que cette partie précise de la Factory réagisse...

    Une recherche sur le forum devrait te permettre de trouver du code pour implémenter ce DP particulier
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Les variables globales ou statiques ne sont pas partagées d'un "module" (EXE, DLL) à l'autre.

    Donc, soit tu mets tous tes singleton dans une DLL et jamais dans une bibliothèque statique,
    Soit tu fais un truc encore plus zarb, alloué dynamiquement, etc. Je n'ai pour l'instant rien trouvé de plus simple qu'un FileMapping dont le nom contiendrait un préfixe + l'ID du process, mais je cherche toujours.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Merci pour vos réponses.

    @Koala : pas de problème pour l'implémentation du singleton, mais au final je vais me retrouver avec une variable static de classe au lieu d'une variable static locale, cela suffira à ce qu'elle ne soit initialiser qu'une seule fois ? D'après la réponse de Médinoc, les variables static ne sont pas partagées non plus.

    Bon je vais creuser de ce côté là.

  5. #5
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Bon après plusieurs tests, il semblerait que les variables statiques des classes de la première bibliothèque ne sont pas initialisées si les headers de ces classes ne sont pas directement inclus dans la seconde bibliothèque. Or ce sont ces variables static qui appelait la fonction pour récupérer la factory :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // A.h
    class A : public B
    {
    //...
    static bool registration;
    };
     
    //A.cpp
     
    bool A::regitration = getFactory().register(//....);
    Du coup la factory n'était pas créée par la première lib, et donc instancié lors de l'appel à la méthode getFactory dans la seconde lib.

    J'imagine que le problème serait le même avec des dlls ?

  6. #6
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Une bibliothèque statique, lorsqu'elle est liée à une autre bibliothèque ou un programme, est recopiée intégralement. Donc dans ton cas, tu as un singleton (Koala, c'est déjà un singleton, son truc ) dans ta bibliothèque dynamique et vraisemblablement UN AUTRE dans ton programme. Et l'un n'est pas accessible à l'autre.
    Donc tu dois créer une bibliothèque dynamique avec ton singleton qui sera liée sur ta bibliothèque et ton programme, et là ça devrait marcher sans problème (quoiqu'en dise Médinoc ).
    L'autre problème que tu as, c'est que tu penses que les variables statiques de ta bibliothèque statique seront instanciés au chargement de la bibliothèque, c'est faux, sauf si tu les références tous dans la bibliothèque dynamique ou le programme auquel tu lie ta bibliothèque statique. En effet, seuls les éléments référencés d'une bibliothèque statique seront recopiés dans l'autre bibliothèque/programme. Et c'est peut-être tout simplement ça ton problème, auquel cas la solution est à nouveau la bibliothèque dynamique.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C++] Pb avec les variable static dans les classe
    Par quantik-revolution dans le forum C++
    Réponses: 3
    Dernier message: 03/03/2006, 18h40
  2. [C#] Variable static
    Par fremsoi dans le forum Windows Forms
    Réponses: 12
    Dernier message: 25/01/2006, 21h07
  3. [VB6]Initialiser une variable Static dans un évenement
    Par loverdose dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 20/01/2005, 14h57
  4. [héritage] héritage d'une variable static
    Par yaya44 dans le forum Langage
    Réponses: 14
    Dernier message: 29/09/2004, 13h36
  5. Variable static avec thread
    Par oxor3 dans le forum Threads & Processus
    Réponses: 7
    Dernier message: 27/08/2004, 11h45

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