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 :

Extension de déclaration d'un attribut static...


Sujet :

C++

  1. #1
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut Extension de déclaration d'un attribut static...
    Bonjour,
    suite à une migration d'un programme C++ compilé avec Visual Studio vers gcc de Linux, j'ai du faire quelques changement dont un qui m'a surpris.

    Sous Visual, voici le .h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    class A
    {
    ...
       void Methode();
    private:
       static const char TYPE='A';
    };
    Le .cpp, toujours avec Visual :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void A::Methode()
    {
       cout<<TYPE;
    }
    Avec gcc, TYPE est inconnu...il faut donc ajouter la déclaration pour étendre la portée, soit dans le .cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    const char A::TYPE;
    Quelqu'un peut il m'éclairer sur ce sujet ? et si quelqu'un sait, que dit la norme POSIX ?

    Merci
    La vitesse de la lumière étant supérieure à celle du son, il apparaît normal que beaucoup de gens paraissent brillants jusqu'à ce qu'ils l'ouvrent.

  2. #2
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    J'ai visual C++.net, et j'ai toujours été obligé d'initialiser les variables statiques dans mon .cpp.

    Va falloir que j'essaie de compiler ton code.

  3. #3
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Effectivement, ça compile.

    Va falloir que je revoie mes notions sur les membres statiques

  4. #4
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    yo,

    moi on m'a appris que les variables statiques d'une classe sont initialisées dans le .cpp, d'ailleurs dans la FAQ
    http://c.developpez.com/faq/cpp/?pag...SS_init_static


    cela dit
    http://c.developpez.com/faq/cpp/?pag...S_static_const


    j'aurais tendance à dire que le compilo Linux a raison de ne pas vouloir compiler?

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Norme POSIX ? Que vient-elle faire ici ? Le C++ est défini par une norme ISO (et donc ANSI, AFNOR... mais pas POSIX).


    A part ça, déclarer une variable statique dans une classe ne fait que ça : La déclarer, quand bien même on lui fourni par commodité une valeur initiale directement dans la classe.

    Il faut quoi qu'il arrive la définir dans un fichier cpp (et un seul), par exemple en ajoutant const char A::TYPE;

    Donc gcc a parfaitement raison, mais le code correct doit aussi marcher avec VC++, non ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    A ma grande surprise, le "code correct" ne marche pas pour Vc++...

    Win32 error LNK2005: "protected: static char const A::TYPE" (?TYPE@Variable@@1DB) déjà défini(e) dans A.obj
    Pour POSIX, sorry, je me suis planté, c'était ISO.
    Merci
    La vitesse de la lumière étant supérieure à celle du son, il apparaît normal que beaucoup de gens paraissent brillants jusqu'à ce qu'ils l'ouvrent.

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu as bien enlevé le = 'A' de la déclaration ?

    Hum... A part ça, les constantes statiques entières peuvent être déclarées et définies en un seul coup (ie. le code initial est correct), ou j'ai loupé quelque chose ?

  8. #8
    Membre habitué Avatar de SteelBox
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Novembre 2002
    Messages : 446
    Points : 194
    Points
    194
    Par défaut
    Au temps pour moi, j'ai voulu aller trop vite et j'avais oublié d'enlever l'initialisation.
    Ca marche bien :-)
    La vitesse de la lumière étant supérieure à celle du son, il apparaît normal que beaucoup de gens paraissent brillants jusqu'à ce qu'ils l'ouvrent.

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

Discussions similaires

  1. [C#] Peut-on dériver un attribut static ?
    Par 5:35pm dans le forum C#
    Réponses: 2
    Dernier message: 16/05/2006, 01h12
  2. Attributs static d'une classe
    Par Edouard Kaiser dans le forum C++
    Réponses: 15
    Dernier message: 04/04/2006, 00h17
  3. Réponses: 3
    Dernier message: 13/12/2005, 09h52
  4. Attributs static
    Par poinclin dans le forum Langage
    Réponses: 4
    Dernier message: 18/06/2004, 14h57
  5. [Info]déclaration d'un attribut
    Par totof2308 dans le forum Langage
    Réponses: 6
    Dernier message: 28/04/2004, 14h30

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