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 mettre des _ et des __ à outrance?


Sujet :

C++

  1. #1
    Membre éprouvé
    Lycéen
    Inscrit en
    Juillet 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juillet 2007
    Messages : 148
    Par défaut Pourquoi mettre des _ et des __ à outrance?
    Salut à tous.

    Je me balladais sur internet, quand je suis tombé sur le code source de la classe std::complex<>, et je me demande pourquoi il y a des _ et des __, à part pour réduire la lisibilité de code?

    Merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 9
    Par défaut
    Salut,
    personnellement, je place des "_" devant les noms de variables dans mes classes, pour les distinguer des autres variables.

    Exemple pour une fonction quelconque j'écrirais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void initialiser(int angle) {
    _angle = angle; // _angle est celui de la classe et angle la variable envoyée
    }
    Pour le lien que tu as envoyé, ce doit être des méthodes de programmation mais je sais pas à quoi elles correspondent.


  3. #3
    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 : 51
    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
    Par défaut
    Citation Envoyé par Willy S. Voir le message
    Salut,
    personnellement, je place des "_" devant les noms de variables dans mes classes, pour les distinguer des autres variables.
    Tu n'as pas le droit de le faire.

    Tous les noms qui ont __ n'importe où ou un _ au début sont réservés (les règles sont plus détaillées, mais autant simplifier et ne pas prendre de risque), et l'utilisateur d'un compilateur n'est pas sensé les utiliser.

    L'objectif ? Réserver toute une série de noms que la personne qui implémente un compilateur C++ ou sa bibliothèque standard pourra utiliser, sans risque qu'ils entrent en conflit avec un nom défini par l'utilisateur.

    Donc, à ne pas respecter cette contrainte du langage, tu t'expose à ce que ton code soit non portable, car entrant en conflit avec la bibliothèque standard d'un autre compilateur.
    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.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 9
    Par défaut
    Ah merci de la précision, je vais rectifier cela.
    C'est vrai que je me souviens d'avoir lu quelque part d'utiliser les préfixes "m_" dans nos classes (et non "_").
    C'est bon ça alors ?

  5. #5
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Oui, et tu peux aussi suffixer par "_". Du genre angle_ = angle; ...

  6. #6
    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 : 51
    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
    Par défaut
    Personnellement, je préfère les nommer avec my ou mon, myAngle = angle. Je trouve qu'avoir un nom aisément prononçable facilite la fluidité de lecture, ainsi que les discussions entre collègues autour du code.
    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.

  7. #7
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Si tu regardes chez Loki, il fait angle_, si tu regarde chez boost ils font m_angle...

    %C'est à toi de voir, en tout cas surtout pas _angle ni __angle.

  8. #8
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Personnellement je trouve le code de Loki très lisible.

  9. #9
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 308
    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 308
    Par défaut
    Et là les spécs qualité décidées en partenariat avec ton client principal demandent de post-fixer les noms des paramètres formels par ... un underscore.
    C'est déroutant au début, et puis on s'y fait bien jusqu'à ce que l'on réouvre un code loki/ACE/...
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  10. #10
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    362
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 362
    Par défaut
    pour tout ce qui est variable passée en paramètre, j'ai tendance à placer un "val" devant.

    par exemple: ObjAdmin = valObjAdmin;

    ceci dit, j'ai complètement ommis de discerner mes variable de ma classe de celles de la fonction par exemple...grosse erreur

  11. #11
    Membre émérite Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Par défaut
    Citation:
    Envoyé par Willy S. Voir le message
    Salut,
    personnellement, je place des "_" devant les noms de variables dans mes classes, pour les distinguer des autres variables.
    Tu n'as pas le droit de le faire.
    Hé bien moi je fait comme Willy S. Et je ne vois vraiment pas pourquoi on n'aurait pas le droit.

    Effectivement, je suis d'accord que les _ et __ sont utilisés pour les fonctions internes (du système, du compilo ou je ne sais quoi). Mais l'intérieur d'une classe n'est pas censé être visible de ses utilisateurs, et tant bien même qu'on ait à faire à une structure, le scope permet de ne pas rentrer en conflit.

    Pour moi, les namespace et les classes sont des moyens de cloisonner notre code et de pouvoir prendre à peu près toutes les libertés de convention de nomage.

  12. #12
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Citation Envoyé par valefor Voir le message
    Hé bien moi je fait comme Willy S. Et je ne vois vraiment pas pourquoi on n'aurait pas le droit.

    Effectivement, je suis d'accord que les _ et __ sont utilisés pour les fonctions internes (du système, du compilo ou je ne sais quoi). Mais l'intérieur d'une classe n'est pas censé être visible de ses utilisateurs, et tant bien même qu'on ait à faire à une structure, le scope permet de ne pas rentrer en conflit.

    Pour moi, les namespace et les classes sont des moyens de cloisonner notre code et de pouvoir prendre à peu près toutes les libertés de convention de nomage.
    Sauf que si une implémentation défini, par exemple, une macro _angle, tu a beau entourer ton identifiant _angle de tous les namespaces que tu veux, il y aura quand même un conflit.

  13. #13
    Membre expérimenté Avatar de Kujara
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    262
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 262
    Par défaut
    Citation Envoyé par Sylvain Togni Voir le message
    Sauf que si une implémentation défini, par exemple, une macro _angle, tu a beau entourer ton identifiant _angle de tous les namespaces que tu veux, il y aura quand même un conflit.
    C'est pour ça que le standard t'interdit d'utiliser le double underscore, ou l'underscore suivit d'une majuscule.

    Donc techniquement tu peux déja utiliser _angle puisque c'est minuscule, mais pas _Angle ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void initialiser(int angle) {
    _angle = angle; // _angle est celui de la classe et angle la variable envoyée
    }
    C'est mal ^^.

    m_nomdubidule c'est mieux .

    Enfin, question de gout, bien sur.

    Perso j'utilise _function() pour les fonctions privées de mes classes, mais c'est tout.

  14. #14
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Ceux qui préfixes leurs variables d'un "_" confondent peut être avec la pratique courante du C# : préfixer les attributs membres d'un underscore et l'enlever dans la définition de sa property.

    En tout cas je rejoins les autres : en C++, pour ces propres classes c'est mal

  15. #15
    Membre émérite Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Par défaut
    Sauf que si une implémentation défini, par exemple, une macro _angle, tu a beau entourer ton identifiant _angle de tous les namespaces que tu veux, il y aura quand même un conflit.
    Je voulais uniquement parler des attributs des classes.

  16. #16
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 308
    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 308
    Par défaut
    Citation Envoyé par valefor Voir le message
    Je voulais uniquement parler des attributs des classes.
    Et ?
    En quoi une macro sait faire la différence entre une classe et un espace de noms ?

    Le seul truc opposable, c'est que seuls _TOTO et __toto sont réservés (_Toto aussi ?).
    Après, pour éviter les pièges idiots, on généralise. D'autant que cela permet d'assurer une uniformité, et de lever la tentation d'également nommer de la sorte les classes embarquées, en particulier celles dont le nom est un accronyme.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  17. #17
    Membre émérite Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Par défaut
    Je ne comprend vos explications sur les macros.

    Par exemple j'ai la classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Foo
    {
    unsigned _bar;
    }
    Où est le risque que _bar soit vu d'où que ce soit ? Vous pouvez me donner un exemple ?

    Les sénior qui bossent avec moi m'ont appris à éviter les macros comme la peste, et l'expérience m'a effectivement montré qu'il y a très peu de choses qu'on ne puisse pas coder en C++ sans avoir recours aux macros. Question lisibilité notamment les macros ne sont pas géniales. Puis pour débugger non plus...

  18. #18
    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 : 51
    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
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #include<vector>
    class Foo
    {
    unsigned _Bar;
    }
    Pour peu que dans vector, que tu ne contrôles pas, il y ait la ligne suivante (autorisée par le standard) :
    Ton code est cassé.
    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.

  19. #19
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par valefor Voir le message
    Je ne comprend vos explications sur les macros.

    Par exemple j'ai la classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Foo
    {
    unsigned _bar;
    }
    Où est le risque que _bar soit vu d'où que ce soit ? Vous pouvez me donner un exemple ?

    Les sénior qui bossent avec moi m'ont appris à éviter les macros comme la peste, et l'expérience m'a effectivement montré qu'il y a très peu de choses qu'on ne puisse pas coder en C++ sans avoir recours aux macros. Question lisibilité notamment les macros ne sont pas géniales. Puis pour débugger non plus...
    Le problème intervient si l'implantation utilise une macro nommé _bar dans un fichier d'en-tête (je sais que _Bar est réservé, qu'en est-il de _bar?)... Dans ce cas, peu importe la portée où est définie ta variable. Tu ne pourras pas l'empêcher, même si on utilise beaucoup moins les macros en C++ qu'en C.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  20. #20
    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 : 51
    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
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    (je sais que _Bar est réservé, qu'en est-il de _bar?)...
    Citation Envoyé par Le standard
    — Each name that contains a double underscore (_ _) or begins with an underscore followed by an uppercase letter (2.11) is reserved to the implementation for any use.
    — Each name that begins with an underscore is reserved to the implementation for use as a name in the global namespace.165)
    [...]
    3 Each name having two consecutive underscores (2.11) is reserved to the implementation for use as a name with both extern "C" and extern "C++" linkage.
    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.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Mettre à jour les charsets des tables ET des champs
    Par dev_web2 dans le forum Requêtes
    Réponses: 2
    Dernier message: 09/12/2009, 09h21
  2. Trigger pour mettre des droits sur des procedures et des vues
    Par briino dans le forum Développement
    Réponses: 3
    Dernier message: 23/09/2009, 10h44
  3. Réponses: 3
    Dernier message: 13/09/2007, 19h11
  4. Réponses: 13
    Dernier message: 31/08/2007, 14h53
  5. Réponses: 3
    Dernier message: 23/01/2007, 09h14

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