Est-ce que le démarrage de variables / membres avec un trait de soulignement pourrait compliquer le calculateur?

12

On m'a appris depuis le lycée que définir des variables comme celle-ci:

int _a;

ou

int __a;

devrait être considéré comme une mauvaise pratique car cela finirait par énigmer les compilateurs qui utilisent des variables commençant par un trait de soulignement pour nommer les variables temporaires.

Pour autant que je sache, c'est la raison pour laquelle certaines personnes aiment déplacer le trait de soulignement à la fin du nom, comme:

int a_;

Cependant, je vois beaucoup de code tout autour qui utilise des variables de début de soulignement. Et ce code se construit assez bien avec Visual Studio 2010 et g ++ 4.x.

Je me demande donc: est-ce que ce n'est pas un problème de nos jours? Les compilateurs modernes sont-ils plus intelligents dans les conventions de dénomination?

Emiliano
la source
Ce n'est pas une vraie réponse, mais il est probable que les compilateurs C ++ de Microsoft soient spécifiquement plus indulgents à ce sujet car c'est le style interne de Microsoft d'utiliser des traits de soulignement avant les variables de membre privé (au moins en C #). Je sais que g ++ peut toujours avoir des problèmes avec les soulignés principaux.
KChaloux
6
Vous pourriez trouver les réponses à cette question utiles.
Blrfl
1
@KChaloux si vous pensez que l'équipe du compilateur C ++ de Microsoft, qui existe depuis plus de 20 ans, a établi les règles concernant les noms d'identifiants acceptables en fonction des habitudes de certaines personnes de l'équipe C #, vous ne savez pas comment Microsoft fonctionne :-). Sérieusement, cela fait 21 ans qu'ils n'ont pas sorti leur premier compilateur C ++ et ces règles remontent aussi loin ou plus loin dans la base de code du compilateur C d'origine.
Kate Gregory
@Kate Je faisais juste remarquer que je savais pertinemment qu'ils l'utilisaient en C #. Je n'utilise pas le compilateur C ++ de Microsoft, ou je connais énormément de choses sur l'environnement là-bas, donc je déduisais leur utilisation de ce style de dénomination en C ++ à partir de mon expérience avec C #. Je n'ai jamais prétendu que la règle C # venait en premier.
KChaloux

Réponses:

17

Vous comprenez apparemment mal la raison pour laquelle les préfixes soulignés sont de mauvaises pratiques. Pour faire court, c'est parce que les standards C et C ++ réservent ces préfixes pour les détails d'implémentation, par exemple pour l'implémentation de bibliothèque standard. (notez que _ et __ ne sont pas réservés aux mêmes choses, voir commentaires)

Même si les noms sont sous la portée (espace de noms, classe, etc.), il peut y avoir des noms globaux, en particulier des macros, qui utilisent ces préfixes et peuvent briser silencieusement votre code si vous les utilisez aussi.

Donc, fondamentalement, la plupart du temps, il est sûr d'utiliser ces préfixes MAIS si vous ne les utilisez pas, vous avez une garantie à 100% que votre nom ne sera jamais en conflit avec les noms d'implémentation.

C'est pourquoi, dans le doute, n'utilisez pas ces préfixes.

Klaim
la source
3
vos commentaires s'appliquent au préfixe de deux traits de soulignement mais pas à un seul trait de soulignement
Kate Gregory
1
@KateGregory: les noms avec un trait de soulignement de tête sont réservés à l'utilisation par l'implémentation pour les noms dans l'espace de noms global. Un trait de soulignement de tête suivi d'un second trait de soulignement ou majuscule sont réservés à toute utilisation (ils peuvent être utilisés pour les macros par l'implémentation). Ainsi, un trait de soulignement de tête suivi d'une lettre minuscule peut être correct dans les étendues locales, mais il vaut mieux éviter de trébucher et d'utiliser un nom réservé.
Bart van Ingen Schenau
4
@KateGregory: En tant que membre, ce _limitn'est pas une erreur, mais c'est une fonction globale. Je pense qu'il vaut mieux avoir une politique simple qui dit "n'utilisez pas de soulignements principaux, sans exception" qu'une politique qui les autorise dans certains contextes et pas dans d'autres. Mais nous pouvons convenir de différer sur ce point. Et pour être clair, je n'ai aucun problème avec les soulignés ailleurs qu'au tout début.
Bart van Ingen Schenau
2
@BartvanIngenSchenau: juste pour l'intérêt: une politique simple comme "utiliser les soulignements principaux juste et uniquement pour les membres de la classe privée" ne devrait pas entraîner de problèmes techniques, que pensez-vous, est-ce vrai?
Doc Brown
1
@KateGregory Juste pour clarifier, je suis d'accord que les règles sont plus précises que ce que je dis dans ma réponse; mais cela reflète le manque de précision de ma mémoire quand j'essaie de me rappeler quelles sont exactement les règles. Comme j'ai tendance à éviter d'avoir à connaître les exceptions (pas la fonctionnalité), je préfère des règles générales faciles à suivre, en particulier pour des règles aussi peu importantes. Ce qui est amusant, c'est que je suis plus à l'aise avec les mouvements sémantiques que de m'en souvenir. Peut-être que ce n'est pas amusant maintenant que j'y pense ...
Klaim
16

L'utilisation de deux traits de soulignement est définitivement mauvaise - réservée aux détails d'implémentation spécifiques au compilateur. Cela ne s'applique pas à l'utilisation d'un trait de soulignement.

Certaines personnes détestent les soulignés. Que vous appeliez quelque chose m_indexou highest_priceou _a- ils le détestent. Il y a 25 ans, j'ai travaillé avec quelqu'un qui m'a parlé d'une imprimante IBM spécifique (très populaire) qui pouvait contenir plus de lignes sur la page en omettant le pixel inférieur sur toutes les autres lignes. C'était bien pour les mémos, ou pour la sortie de grandes quantités de nombres et autres, mais cela avait pour effet de rendre le code de la moitié de vos soulignements invisibles. (Oui, vraiment!) Les gens de cette génération ont généralement la haine irrationnelle du trait de soulignement, que ce soit à cause de l'interaction avec cette imprimante ou du fait de travailler avec quelqu'un qui les a frappés et qui ne doivent pas utiliser de traits de soulignement.

La plupart des gens en utilisant le cas mixte (une option que nous n'avions pas, disons, Fortran) une approche plus lisible: mIndex, HighestPrice, ase lever assez bien les exemples précédents soulignés. Je vais vous donner deux règles:

  • ne jamais rien démarrer (fonction, variable, macro, typedef) avec deux traits de soulignement
  • choisissez une convention cohérente (par exemple _limitpour les paramètres de fonction, m_limitpour les variables de membre, n'utilisez jamais de soulignements, cas de chameau, mettez en majuscule chaque mot, hongrois, quelque chose ) et respectez-le. Ne vous trompez pas parfois avec des traits de soulignement au début, parfois à la fin, parfois sans les utiliser, et cinq conventions de casse différentes. Être cohérent.

L'imprimante en question a disparu depuis longtemps. Si vous souhaitez utiliser un trait de soulignement à la fois, n'hésitez pas à le faire. Mais comprenez, les haineux soulignés existent toujours.

Kate Gregory
la source
"Que vous appeliez quelque chose m_index ou le prix le plus élevé ou _a - ils le détestent" Pas sans raison! Vous n'avez fait aucune mention du fait qu'il existe des règles dans les normes concernant spécifiquement l'utilisation de soulignements principaux dans les identificateurs. Pourquoi demander des ennuis quand on les évite si facilement? stackoverflow.com/a/228797
Max Barraclough
fait aucune mention? Relisez la première phrase.
Kate Gregory
"Cela ne s'applique pas à l'utilisation d'un seul trait de soulignement" n'est pas toute l'histoire, voir mon lien, qui dit que mener avec des doubles tirets bas est un non-non assez défini, mais que "Réservé dans l'espace de noms global: identificateurs commençant par un souligner". Pourquoi jouer avec le feu?
Max Barraclough
1
ok, vous manquez le point. Le deuxième paragraphe discute de l'existence de personnes qui sont, en général, anti-souligné. Pas de soulignement. Tous les soulignements. Oui, il est vrai qu'en plus de la règle concernant les deux traits de soulignement, il existe également une règle concernant les traits de soulignement principaux suivis d'une lettre majuscule, les traits de soulignement de portée mondiale, etc., mais cela mis à part, certaines personnes détestent quand même les soulignés. Et ces gens sont ce que j'aime appeler mal. Il n'y a aucune raison fondée sur des normes de s'opposer à des soulignements non significatifs. Mais les gens le font quand même.
Kate Gregory
C'est là que nous ne sommes pas d'accord. Oui, il est parfois légal de commencer un identifiant avec un seul trait de soulignement. Comme je l'ai dit plus haut, pourquoi jouer avec le feu? Je ne démarre jamais un identifiant avec un trait de soulignement; Je le vois comme une odeur de code (si l'on peut dire «voir» une odeur :-P). De cette façon, je ne m'inquiète jamais des détails des règles qui me disent précisément quand il est légal de le faire.
Max Barraclough