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 :

caractere under sore sur le nom d'une variable


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Par défaut caractere under sore sur le nom d'une variable
    Bonsoir à tous,

    j'aimerai connaître la particularité des variables dont le nom commence par un caractère under score "_" en C

    Y a t'il un but particulier qui pousse certains développeur à utiliser ce type de nom pour leurs variables ?

    Merci d'avance pour vos différentes réponses

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    En gros, les identificateurs commencant par un underscore et ceux contenant deux underscore consecutif(*) sont reserves pour l'implementation(**). Ils ne faut donc pas les utiliser. L'objectif est que de donner aux implementations la possiblilite d'utiliser des identificateurs prives qui ne risquent pas d'entrer en conflit avec ceux des utilisateurs.

    Probleme, certains ont ete voir comment les implementations etaient programmees et ont copie leur style en utilisant des identificateurs commencant par des underscores. Et en risquant ainsi le conflit avec les implementation.

    (*) Je sais, c'est pas le cas en C mais c'est le cas en C++ et en pratique il vaut mieux les eviter aussi.
    (**) Plus en details, suivant la portee consideree, certains identificateurs peuvent ne pas etre reserves. Je me refuse a apprendre ces details.

  3. #3
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Salut,

    Pour être un petit peu plus précis (simple complément de réponse), la norme du langage C exige que les identificateurs commençant par un underscore et une lettre majuscule ou commençant par deux underscores sont réservés, tout comme les identificateurs qui commencent par un underscore et qui ont une portée au niveau du fichier.
    Citation Envoyé par C11 (n1570), § 7.1.3, al. 1, p. 182
    — All identifiers that begin with an underscore and either an uppercase letter or another underscore are always reserved for any use.
    — All identifiers that begin with an underscore are always reserved for use as identifiers with file scope in both the ordinary and tag name spaces.
    Généralement, cela implique que ceux-ci sont potentiellement utilisés par la bibliothèque standard de C. Toute utilisation de tels identificateurs peut engendrer une collision. Quelques exemples suivent.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /* 
     * Interdit car `struct _s' a une portée au niveau du fichier. 
     */
    struct _s {  
     
    	/* 
    	 * Interdit car `__n' commence par deux underscores. 
    	 */
    	int __n; 
     
    	/* 
    	 * Interdit car `_N' commence par un underscore et une lettre 
             * majuscule. 
    	 */
    	int _N;  
     
    	/*
    	 * Autorisé car `_n' n'a pas une portée au niveau du fichier.
    	 */
    	int _n;
    };
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2010
    Messages : 6
    Par défaut Merci
    Je vous remercie pour ces éclaircissements. donc en gros les programmeurs qui postent les codes de leurs tutos avec de tel identificateur, sont des hors la loi !

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 450
    Par défaut
    Citation Envoyé par Kirilenko Voir le message
    Salut,

    Pour être un petit peu plus précis (simple complément de réponse), la norme du langage C exige que les identificateurs commençant par un underscore et une lettre majuscule ou commençant par deux underscores sont réservés, tout comme les identificateurs qui commencent par un underscore et qui ont une portée au niveau du fichier.
    À noter également que le passage que tu cites est tiré de C11, qui est une norme toute récente. C'est surtout C99 et C89 qui font encore référence aujourd'hui, mais cela reste une bonne idée de se conformer à cette règle en particulier.

  6. #6
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    À noter également que le passage que tu cites est tiré de C11, qui est une norme toute récente. C'est surtout C99 et C89 qui font encore référence aujourd'hui, mais cela reste une bonne idée de se conformer à cette règle en particulier.
    De mémoire, ça n'a pas changé depuis C90.

  7. #7
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    À noter également que le passage que tu cites est tiré de C11, qui est une norme toute récente. C'est surtout C99 et C89 qui font encore référence aujourd'hui, mais cela reste une bonne idée de se conformer à cette règle en particulier.
    En effet, et cela est volontaire : je me rapporte toujours à la norme la plus récente quand il s'agit de détails techniques, au cas où les spécifications aient changé, justement. Même si la C11 n'est pas actuellement implémentée en masse, les points un peu plus sombres des normes précédentes sont ainsi corrigés, et l'ambiguïté est réduite.

    Question de goût, après, mais, quand j'incorporais des citations de C89 à mes messages sur StackOverflow par exemple, on se moquait un peu de moi ! Au final, je ne trouve pas ça si mal.

    Histoire d'optimiser et de clore cette discussion, voici le passage de la norme C89 à ce sujet.

    Citation Envoyé par C89 (X3J11-1988), § 4.1.2 Standard headers
    All external identifiers that begin with an underscore are reserved. All other identifiers that begin with an underscore and either an upper-case letter or another underscore are reserved.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 450
    Par défaut
    Citation Envoyé par Kirilenko Voir le message
    En effet, et cela est volontaire : je me rapporte toujours à la norme la plus récente quand il s'agit de détails techniques, au cas où les spécifications aient changé, justement. Même si la C11 n'est pas actuellement implémentée en masse, les points un peu plus sombres des normes précédentes sont ainsi corrigés, et l'ambiguïté est réduite.
    Oui, mais n'oublie pas que la norme n'est pas qu'une somme de restrictions. C'est aussi et souvent des fonctionnalités supplémentaires qui, parfois, impliquent beaucoup d'infrastructures sous-jacentes voire une « formation » des développeurs à ces nouveautés.

    Par exemple, C11 propose « #include <thread.h> », ce qui est quand même lourd de conséquences, car toutes les architectures ne sont pas en mesure de proposer ces services. Heureusement, les gens qui ont planché dessus le savent et ont introduit _ _STDC_NO_THREADS_ _, qui doit être définie par le compilateur le cas échéant.

    Il en reste que, dans certains cas, deux versions de la norme d'un même langage peuvent parfois être considérées comme deux langages différents, comparables (mais dans une moindre mesure) à ce qui sépare le C et le C++.

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

Discussions similaires

  1. + de details sur le nom d'une colone.
    Par KINENVEU dans le forum Requêtes
    Réponses: 3
    Dernier message: 12/10/2007, 00h58
  2. Requete sur le nom d'une table.
    Par LyLy_91 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 02/07/2007, 11h31
  3. Garder le nom d'une variable sur plusieurs pages
    Par leloup84 dans le forum Langage
    Réponses: 2
    Dernier message: 25/10/2006, 14h21
  4. test sur le nom d'une fonction
    Par Art19 dans le forum C
    Réponses: 6
    Dernier message: 26/06/2006, 18h29
  5. [XSL] Test sur le nom d'une balise
    Par KibitO dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 18/12/2005, 13h44

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