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 397
    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 397
    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